ISO 8601
Как и пара других упомянутых ответов, рассматриваемый формат даты и времени определяется RFC 4517 Облегченный протокол доступа к каталогам (LDAP): синтаксисы и правила сопоставления . См. Раздел 3.3.13, Обобщенное время .
В этом разделе поясняется, что этот формат LDAP является ограниченной версией одного из форматов даты и времени, определенных ISO 8601 . Этот стиль, использующий минимум разделителей, известен как «базовый» в ISO 8601.
В этих форматах Z
в конце является коротким для Zulu
и означает UTC (в основном то же самое, что и GMT).
Десятичная точка и цифра в конце представляют долю секунды. Обратите внимание, что вместо точки (точки) в RFC 4517 и ISO 8601 возможна запятая. Фактически рекомендуется использовать запятую над точкой в ISO 8601. Спецификация RFC 4517 допускает использование только одной цифры (несколько десятых доли). ) или без точки / запятой и цифры вообще. В отличие от этого: (a) ISO 8601 допускает любое количество дробных цифр и (b) объекты java.time имеют наносекундное разрешение до девяти цифр дробной секунды.
java.time
Инфраструктура java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют старые проблемные классы даты и времени, такие как java.util.Date
, .Calendar
и & java.text.SimpleDateFormat
.
Теперь в режиме обслуживания , проект Joda-Time также рекомендует перейти на java.time.
Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений.
Большая часть функций java.time перенесена в Java 6 & 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP .
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time.
Синтаксический
Определите шаблон форматирования, соответствующий RFC 4517. Изучите класс DateTimeFormatter
для кодирования шаблона. Это должно работать: uuuuMMddHHmmss[,S][.S]X
. Квадратные скобки означают необязательно . Мы размещаем либо точку, либо запятую. Обратите внимание на единственную цифру за долю секунды. X
на конце допускает либо Z
, либо смещение от UTC , такое как -08 или -0830 или -08: 30 или -083015 или -08: 30: 15.
String input = "20090813145607.0Z";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "uuuuMMddHHmmss[,S][.S]X" );
OffsetDateTime odt = OffsetDateTime.parse ( input , f );
Instant instant = odt.toInstant ();
Дамп на консоль.
System.out.println ( "input: " + input + " | odt: " + odt + " | instant: " + instant );
input: 20090813145607.0Z | odt: 2009-08-13T14: 56: 07Z | мгновенное: 2009-08-13T14: 56: 07Z
Конечно, вы также должны кодировать проверку для java.time.format.DateTimeParseException
в случае неожиданного ввода.