Что это за формат даты? 2011-08-12T20: 17: 46.384Z - PullRequest
273 голосов
/ 06 декабря 2011

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

Ответы [ 6 ]

387 голосов
/ 06 декабря 2011

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

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

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

43 голосов
/ 22 апреля 2016

ТЛ; др

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

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

ISO 8601

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

T отделяет часть даты от части времени суток. Z в конце означает UTC (то есть смещение от UTC, равное нулю часов, минут и секунд). Z это произносится как "зулу" .

java.time

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

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

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

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

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

О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где взять классы java.time?

  • 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 связывают реализации классов java.time.
    • Для более ранних версий Android проект ThreeTenABP адаптируется ThreeTen-Backport (упоминалось выше). См. Как использовать ThreeTenABP… .

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

24 голосов
/ 06 декабря 2011

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

5 голосов
/ 27 апреля 2018

Есть и другие способы разбора, нежели первый ответ. Для разбора:

(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");
0 голосов
/ 09 мая 2019

Этот метод переводит java.util.Date в формат UTC (или любой другой) и обратно.

Определите класс следующим образом:

import java.util.Date;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class UtcUtility {

public static DateTimeFormatter UTC = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").withZoneUTC();


public static Date parse(DateTimeFormatter dateTimeFormatter, String date) {
    return dateTimeFormatter.parseDateTime(date).toDate();
}

public static String format(DateTimeFormatter dateTimeFormatter, Date date) {
    return format(dateTimeFormatter, date.getTime());
}

private static String format(DateTimeFormatter dateTimeFormatter, long timeInMillis) {
    DateTime dateTime = new DateTime(timeInMillis);
    String formattedString = dateTimeFormatter.print(dateTime);
    return formattedString;
}

}

Тогда используйте это так:

Date date = format(UTC, "2020-04-19T00:30:07.000Z")

или

String date = parse(UTC, new Date())

Вы также можете определить другие форматы даты, если вам требуется (не только UTC)

0 голосов
/ 08 января 2019

Вы можете использовать следующий пример.

    String date = "2011-08-12T20:17:46.384Z";

    String inputPattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";

    String outputPattern = "yyyy-MM-dd HH:mm:ss";

    LocalDateTime inputDate = null;
    String outputDate = null;


    DateTimeFormatter inputFormatter = DateTimeFormatter.ofPattern(inputPattern, Locale.ENGLISH);
    DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern(outputPattern, Locale.ENGLISH);

    inputDate = LocalDateTime.parse(date, inputFormatter);
    outputDate = outputFormatter.format(inputDate);

    System.out.println("inputDate: " + inputDate);
    System.out.println("outputDate: " + outputDate);
...