У меня есть следующие даты: 2011-08-12T20:17:46.384Z
. Какой это формат? Я пытаюсь разобрать его с помощью Java 1.4 через, DateFormat.getDateInstance().parse(dateStr)
и я получаю
java.text.ParseException: Неразборчивая дата: "2011-08-12T20: 17: 46.384Z"
Я думаю, что я должен использовать SimpleDateFormat для синтаксического анализа, но я должен сначала знать строку формата. Все, что у меня есть для этого, так это yyyy-MM-dd
потому, что я не знаю, что T
означает эта строка - что-то, связанное с часовым поясом? Эта строка даты взята из lcmis:downloadedOn
тега, отображаемого в типе носителя истории загрузки файлов CMIS .
Z
в конце коротка дляZulu
и средства UTC . Этот формат, безусловно, является частью набора стандартных текстовых форматов даты и времени ISO 8601 . Кстати, эти стандартные форматы по умолчанию используются в классах java.time .java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и Java 9. См. Руководство Oracle .Ответы:
Буква T - это просто литерал для отделения даты от времени, а буква Z означает «смещение нулевого часа», также известное как «время Зулу» (UTC). Если ваши строки всегда имеют «Z», вы можете использовать:
Или используя Joda Time , вы можете использовать
ISODateTimeFormat.dateTime()
.источник
T
иZ
?T
(я не могу вспомнить, как SimpleDateFormat обрабатывает неизвестные спецификаторы), ноZ
мы хотим, чтобы это был символ «Z», а не «значение смещения UTC» (например, «00»).ТЛ; др
Стандартный формат ISO 8601 используется вашей входной строкой.
ISO 8601
Этот формат определяется разумным практическим стандартом ISO 8601 .
T
Отделяет часть даты из части времени в день. ВZ
конце означает UTC (то есть смещение от UTC, равное нулю часов, минут и секунд).Z
Это произносится как «Zulu» .java.time
Старые классы даты и времени, включенные в ранние версии Java, оказались плохо спроектированными, запутанными и хлопотными. Избежать их.
Вместо этого используйте инфраструктуру java.time, встроенную в Java 8 и более поздние версии . Классы java.time вытесняют как старые классы даты и времени, так и очень успешную библиотеку Joda-Time.
Классы java.time по умолчанию используют ISO 8601 при разборе / генерации текстовых представлений значений даты и времени.
Instant
Класс представляет собой момент на шкале времени в формате UTC с разрешением наносекунд . Этот класс может напрямую анализировать вашу входную строку, не заботясь об определении шаблона форматирования.О java.time
Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять неприятные старые устаревшие классы даты и времени , такие как
java.util.Date
,Calendar
, иSimpleDateFormat
.Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на классы java.time .
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Где взять классы java.time?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как
Interval
,YearWeek
,YearQuarter
, и более .источник
Не уверен насчет разбора Java, но это ISO8601: http://en.wikipedia.org/wiki/ISO_8601
источник
Есть и другие способы разбора, а не первый ответ. Чтобы разобрать его:
(1) Если вы хотите получить информацию о дате и времени, вы можете проанализировать ее для
ZonedDatetime
(начиная с Java 8 ) илиDate
(старого) объекта:или
(2) Если вам не важны дата и время и вы просто хотите обрабатывать информацию как момент в наносекундах, вы можете использовать
Instant
:источник
Если вы, ребята, ищете решение для Android, вы можете использовать следующий код, чтобы получить секунды эпохи из строки метки времени.
Пример ввода: 2019-10-15T05: 51: 31.537979Z
Пример вывода: 1571128673
источник
Вы можете использовать следующий пример.
источник
Z
. Это значит ожидать, но игнорировать это письмо. Но это письмо не следует игнорировать. Это письмо предоставляет ценную информацию, тот факт, что строка была предназначена для UTC, смещение нуля. Ваш формат игнорирует этот важный факт. Кроме того, нет необходимости даже беспокоиться об определении этого шаблона форматирования.Этот метод переводит java.util.Date в формат UTC (или любой другой) и обратно.
Определите класс следующим образом:
}
Тогда используйте это так:
или
Вы также можете определить другие форматы даты, если вам требуется (не только UTC)
источник
java.util.Date
проект Joda-Time, и проект Joda-Time были вытеснены несколько лет назад современными классами java.time, определенными в JSR 310. Советы здесь давно устарели.@ Джон-Скит дал мне подсказку, чтобы решить мою проблему вокруг этого. Будучи молодым программистом, эту маленькую проблему легко упустить и ее трудно диагностировать. Так что я делюсь этим в надежде, что это кому-нибудь поможет.
Моя проблема заключалась в том, что я хотел проанализировать следующую строку, противоречащую отметке времени из JSON, на которую я не имею никакого влияния, и поместить ее в более полезные переменные. Но я продолжал получать ошибки.
Поэтому, учитывая следующее (обратите внимание на строковый параметр внутри ofPattern ();
Ошибка:
Проблема? Буква Z в конце шаблона должна быть заключена в букву «Z», как и буква «T». Перейдите
"yyyyMMdd'T'HHmmss.SSSZ"
на"yyyyMMdd'T'HHmmss.SSS'Z'"
и это работает.Удаление Z из шаблона в целом также привело к ошибкам.
Честно говоря, я ожидал бы, что класс Java предвидит это.
источник
T
литерал и должен бытьZ
заключен в кавычки, является смещением (нуля) и должен быть проанализирован как таковой, иначе вы получите неправильные результаты. Я не знаю, что вы имеете в виду, что это не ожидалось, я верю, что это произошло.Z
. Вы отбрасываете ценную информацию. Обработка значения даты и времени при игнорировании часового пояса или смещения от UTC аналогична обработке суммы денег при игнорировании валюты!T
Просто отделяет часть даты от части времени в день, и не добавляет никакого смысла. СZ
другой стороны, определенно добавляет смысл.