Что это за формат даты? 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 189

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;
}