Что это за формат даты? 2011-08-12T20:17: 46.384 Z
у меня есть следующие даты: 2011-08-12T20:17:46.384Z
. Что это за формат? Я пытаюсь разобрать его с помощью Java 1.4 через DateFormat.getDateInstance().parse(dateStr)
и я
java.текст.ParseException: Unparseable дата: "2011-08-12T20: 17: 46.384 Z"
Я думаю, что я должен использовать SimpleDateFormat для разбора, но я должен знать строку формата в первую очередь. Все, что у меня есть для этого до сих пор yyyy-MM-dd
, потому что я не знаю, что с T
значит в этой строке-то связанные с часовым поясом? Эта строка даты исходит из lcmis:downloadedOn
тегов на файлы CMIS скачать историю тип носителя.
5 ответов:
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()
.
tl; dr
стандартный ISO 8601 формат используется входной строкой.
Instant.parse ( "2011-08-12T20:17:46.384Z" )
ISO 8601
этот формат определяется разумным практическим стандартом, ISO 8601.
The
T
отделяет часть даты от части времени суток. ЭлементZ
на конце сокращенноZulu
и означает UTC.java.время
старый классы даты-времени в комплекте с самыми ранними версиями Java оказались плохо спроектированными, запутанными и хлопотными. Избегать их.
используйте java.время фреймворк, встроенный в Java 8 и более поздние версии. Ява.классы время замены старого дата-время занятий и весьма успешный Joda времени библиотека.java.время классы используют ISO 8601 по умолчанию при разборе / генерации текстовых представлений даты-времени ценности.
The
Instant
класс представляет момент на временной шкале в UTC с разрешением наносекунд. Этот класс может непосредственно анализировать вашу входную строку, не утруждая себя определением шаблона форматирования.Instant instant = Instant.parse ( "2011-08-12T20:17:46.384Z" ) ;
о java.время
The java.время фреймворк встроен в Java 8 и более поздние версии. Эти классы вытесняют хлопотный старик наследие классы даты и времени, такие как
java.util.Date
,Calendar
,&SimpleDateFormat
.The Joda Времени, теперь режим обслуживания, советует миграция в java.время классы.
чтобы узнать больше, смотрите Oracle Tutorial. Поиск переполнения стека для многих примеров и объяснений. Спецификация является JSR 310.
где получить java.время занятий?
- Java SE 8,Java SE 9, и позже
- встроенный.
- часть стандартного Java API с комплектной реализацией.
- Java 9 добавляет некоторые незначительные функции и исправления.
- Java SE 6 и Java SE 7
- большая часть java.функциональность time обратно портирована на Java 6 & 7 в ThreeTen-Backport.
- Android
- более поздние версии Android bundle реализации java.время занятий.
- для более ранних Android, ThreeTenABP проект приспосабливается ThreeTen-Backport (упоминалось выше). Смотрите как использовать ThreeTenABP....
The ThreeTen-Extra проект расширяет java.время с дополнительными занятиями. Этот проект является испытательным полигоном для возможных будущих дополнений к java.время. Вы можете найти некоторые полезные классы, такие как
Interval
,YearWeek
,YearQuarter
и больше.
Не уверен в синтаксическом анализе Java, но это ISO8601:http://en.wikipedia.org/wiki/ISO_8601
есть и другие способы, чтобы разобрать его, а не первый ответ. Чтобы разобрать его:
(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");
простой способ решить эту проблему-заменить
"T"
С" "
и удалить.384Z
.Ниже приведена иллюстрация того, как этого добиться:
public static String getTime(String time) { if (time != null) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); if (time.toUpperCase().contains("T") && time.toUpperCase().contains("Z")) { time = time.toUpperCase().replace("T", " "); String[] str = time.split("\."); if (str.length != 0) { return str[0]; } } try { Date date = new Date(time); time = simpleDateFormat.format(date); } catch (Exception e) { // } } return time; }