Преобразование строкового шаблона в формате 01.01.2010 15:23:12 +00: 00 в Java.util.Date - PullRequest
1 голос
/ 29 мая 2019

Я пытаюсь преобразовать строку в формате 1/1/2010 3:23:12 PM +00:00 в Java.util.Date

Невозможно преобразовать формат строки в дату Java.Время не идентифицируется как AM/PM

String s = "1/1/2010 3:23:12 PM +00:00";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss a",Locale.ENGLISH);

Date date = sdf.parse(s));

Нужна ли дата, преобразованная со временем, обозначенным как AM/PM

Ответы [ 2 ]

2 голосов
/ 29 мая 2019

OffsetDateTime - это то, что вы ищете.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("d/M/yyyy h:mm:ss a XXX");
OffsetDateTime time = OffsetDateTime.parse(str, formatter);
System.out.println(time);

Ваш шаблон имеет некоторые проблемы:

  • Ваш день месяца без начального нуля, но вы используете dd;
  • То же самое для месяца с MM;
  • То же самое для часа с HH;
  • Вы используете AM / PM вместе с 24-часовым спецификатором формата (H); Вы должны использовать h вместо.

Я не знаю точно, как SimpleDateFormat обрабатывает часть строки, относящуюся к часовому поясу, но никаких указателей форматирования для часового пояса не дано.

Это одна из причин, почему мне нравится этот API даты и времени: он довольно прост.

0 голосов
/ 29 мая 2019

Невозможно преобразовать формат строки в дату Java.Время не идентифицируется как AM/PM

Вы спрашиваете о невозможном.Date - это момент времени (внутренне реализованный как счетчик миллисекунд со времени так называемой эпохи), поэтому он «ничего не знает» о AM и PM в вашем часовом поясе.

Это то же самоетем не менее, потому что класс Date всегда был плохо спроектирован и, к счастью, давно устарел.Вы не должны использовать его вообще.

java.time

java.time, современный Java-интерфейс даты и времени, который мы должны использовать вместо Date, приближается к выполнению вашего требования,MC Emperor уже показал базовый код, необходимый для анализа вашей строки даты и времени.Вывод его кода:

2010-01-01T15: 23: 12Z

Здесь нет ни AM, ни PM.Когда мы печатаем OffsetDateTime таким образом, его метод toString вызывается неявно.Он создает строку в формате ISO 8601.ISO 8601 предписывает 24-часовые часы (без AM или PM). Но! С помощью правильного TemporalField объекта OffsetDateTime может вычислить и вернуть, находится ли он в AM или PM.time.get(ChronoField.AMPM_OF_DAY) возвращает 0 для AM или 1 для PM:

    System.out.println("AM or PM? 0 for AM. 1 for PM. time: "
            + time.get(ChronoField.AMPM_OF_DAY));

AM или PM?0 для утра.1 для вечера.время: 1

Так что в этом случае мы получили 1 за PM, как и ожидалось, поскольку в вашей исходной строке было PM.

Я намеренно не ответил на все ваши вопросы, потому чтобольшая часть этого была рассмотрена в других вопросах переполнения стека и их ответах уже.Так что лучше хранить там информацию.Ниже приведены ссылки на пару соответствующих вопросов.

Что пошло не так в вашем коде?

В вашем коде есть как минимум две ошибки, каждая из которых приводит к неверному результату.Я попытался запустить ваш код в часовом поясе Америки / Лос-Анджелеса и получил

Пт 01 января 03:23:12 PST 2010

Время напечатано на 24-часовых часах.(Date всегда так делает), поэтому мы получили 03:23:12 утра вместо вечера.И мы получили время в часовом поясе по умолчанию (PST для стандартного тихоокеанского времени), поэтому момент времени соответствует 11:23:12 AM со смещением +00: 00, смещение в строке.

  • Неправильный часовой час происходит из-за противоречивых указаний в вашем коде: HH в строке шаблона формата соответствует часу дня с 00 по 23, поэтому 3 означает 03:00 и, очевидно, «выигрывает» надмаркер PM (для часа в пределах AM или PM от 1 до 12 вам потребуется строчная буква h).
  • Часовой пояс по умолчанию определяется тем, что вы не пытаетесь проанализировать смещениеиз строки (в сочетании с SimpleDateFormat удовлетворением не разбора всей строки).

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...