Вопрос-ответ

What is this date format? 2011-08-12T20:17:46.384Z

Что это за формат даты? 2011-08-12T20:17:46.384Z

У меня есть следующая дата: 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 типа носителя истории загрузок.

Переведено автоматически
Ответ 1

Буква T - это просто литерал, отделяющий дату от времени, а Z означает "смещение нулевого часа", также известное как "время зулу" (UTC). Если в ваших строках всегда есть буква "Z", вы можете использовать:

SimpleDateFormat format = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.US);
format.setTimeZone(TimeZone.getTimeZone("UTC"));

Или используя время Джоды, вы можете использовать ISODateTimeFormat.dateTime().

Ответ 2

tl;dr

В вашей строке ввода используется стандартный формат ISO 8601.

Instant.parse ( "2011-08-12T20:17:46.384Z" ) 

ISO 8601

Этот формат определен разумным практическим стандартом, ISO 8601.

T отделяет часть даты от части времени суток. Z В конце означает UTC (то есть смещение от UTC в ноль часов-минут-секунд). Z Произносится как “зулусский”.

java.time

Старые классы даты и времени, поставляемые в комплекте с самыми ранними версиями Java, оказались плохо спроектированными, запутанными и доставляющими хлопоты. Избегайте их.

Вместо этого используйте фреймворк java.time, встроенный в Java 8 и более поздние версии. Классы java.time заменяют как старые классы даты и времени, так и весьма успешную библиотеку Joda-Time.

Классы java.time используют ISO 8601 по умолчанию при синтаксическом анализе / генерации текстовых представлений значений даты и времени.

Instant Класс представляет момент на временной шкале в UTC с разрешением в наносекунды. Этот класс может напрямую анализировать вашу входную строку, не утруждая себя определением шаблона форматирования.

Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;

Таблица типов даты и времени в Java, как современной, так и устаревшей


О java.time

Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.

Проект Joda-Time, находящийся сейчас в режиме обслуживания, рекомендует перейти на классы java.time.

Вы можете обмениваться объектами java.time непосредственно со своей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах. Поддержка Hibernate 5 и JPA 2.2 java.time.

Где получить классы java.time?

Таблица того, какую библиотеку java.time использовать с какой версией Java или Android

Ответ 3

Не уверен насчет синтаксического анализа Java, но это ISO8601: http://en.wikipedia.org/wiki/ISO_8601

Ответ 4

Существуют другие способы его анализа, а не первый ответ. Для его анализа:

(1) Если вы хотите получить информацию о дате и времени, вы можете проанализировать ее в ZonedDatetime(начиная с Java 8) или Date(старом) объекте:

// ZonedDateTime's default format requires a zone ID(like [Australia/Sydney]) in the end.
// Here, we provide a format which can parse the string correctly.
DateTimeFormatter dtf = DateTimeFormatter.ISO_DATE_TIME;
ZonedDateTime zdt = ZonedDateTime.parse("2011-08-12T20:17:46.384Z", dtf);

или

// 'T' is a literal.
// 'X' is ISO Zone Offset[like +01, -08]; For UTC, it is interpreted as 'Z'(Zero) literal.
String pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSX";

// since no built-in format, we provides pattern directly.
DateFormat df = new SimpleDateFormat(pattern);

Date myDate = df.parse("2011-08-12T20:17:46.384Z");

(2) Если вас не волнуют дата и время и вы просто хотите рассматривать информацию как момент в наносекундах, то вы можете использовать Instant:

// The ISO format without zone ID is Instant's default.
// There is no need to pass any format.
Instant ins = Instant.parse("2011-08-12T20:17:46.384Z");
java date