Jaki jest ten format daty? 2011-08-12T20:17:46.384 Z

Mam następującą datę: 2011-08-12T20:17:46.384Z. Co to za format? Próbuję to przetworzyć za pomocą Javy 1.4 przez DateFormat.getDateInstance().parse(dateStr) i otrzymuję

Java.tekst.ParseException: Unparseable date: "2011-08-12t20:17:46.384 z"

Myślę, że powinienem używać SimpleDateFormat do parsowania, ale najpierw muszę znać format. Na razie mam tylko yyyy-MM-dd, Bo Nie wiem co T oznacza w tym łańcuchu-coś związanego ze strefą czasową? Ten ciąg daty jest pochodzi z znacznika lcmis:downloadedOn pokazanego na plikach typ nośnika historii pobierania CMIS .

Author: Sarah Vessels, 2011-12-06

5 answers

T jest tylko dosłownym znakiem oddzielającym datę od czasu, a Z oznacza " przesunięcie godziny zerowej "znane również jako" czas Zulu " (UTC). Jeśli Twoje stringi Zawsze mają "Z" możesz użyć:

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

Lub używając Joda Time , możesz użyć ISODateTimeFormat.dateTime().

 279
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-13 07:41:31

Tl;dr

Standard ISO 8601 format jest używany przez ciąg wejściowy.

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

ISO 8601

Ten format jest zdefiniowany przez sensowny praktyczny standard, ISO 8601 .

T oddziela porcję daty od porcji pory dnia. Z na końcu jest skrótem od Zulu i oznacza UTC .

Java.CZAS

Stare klasy date-time połączone z najwcześniejszymi wersjami Javy okazały się źle zaprojektowane, mylące i kłopotliwe. Unikaj ich.

Zamiast tego użyj java.time framework wbudowany w Javę 8 i późniejsze. Java.klasy czasu zastępują zarówno stare klasy daty i czasu, jak i bardzo udaną bibliotekę czasu Joda.

Java.klasy czasu używają ISO 8601 domyślnie podczas parsowania / generowania tekstowych reprezentacji wartości data-czas.

The Instant Klasa reprezentuje moment na osi czasu w UTC z rozdzielczość nanosekund . Ta klasa może bezpośrednio parsować Twój łańcuch wejściowy bez zawracania sobie głowy definiowaniem wzorca formatowania.

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

O Javie.czas

The java.czas framework jest wbudowany w Java 8 i nowsze. Klasy te zastępują kłopotliwe staredziedzictwo klasy date-time, takie jak java.util.Date, Calendar, & SimpleDateFormat.

The Joda-czas Projekt, teraz w trybie konserwacji, zaleca migrację do java.CZAS klasy.

Aby dowiedzieć się więcej, Zobacz samouczek Oracle. I wyszukaj przepełnienie stosu dla wielu przykładów i wyjaśnień. Specyfikacja to JSR 310 .

Skąd pobrać Javę.zajęcia czasowe?

The ThreeTen-Extra projekt rozszerza Javę.czas z dodatkowymi zajęciami. Ten projekt jest poligonem dla potencjalnych przyszłych dodatków do Javy.czas. Możesz znaleźć tutaj kilka przydatnych klas, takich jak Interval, YearWeek, YearQuarter, i więcej .

 27
Author: Basil Bourque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-03 00:48:00

Nie jestem pewien co do parsowania Javy, ale to ISO8601: http://en.wikipedia.org/wiki/ISO_8601

 22
Author: smparkes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-06 18:48:39

Są inne sposoby analizy, a nie pierwsza odpowiedź. Aby go przeanalizować:

(1) jeśli chcesz pobrać informacje o dacie i czasie, możesz je przetworzyć do ZonedDatetime (od Java 8) lub Date(old) obiektu:

// 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);

Lub

// '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) Jeśli nie zależy ci na dacie i godzinie i chcesz traktować informacje jako moment w nanosekundach, możesz użyć 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");
 1
Author: VeryLazyBoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-27 08:10:44

Łatwym sposobem rozwiązania tego problemu jest zastąpienie "T" z " " i usunąć .384Z.

Poniżej znajduje się ilustracja jak to osiągnąć:

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;
}
 -9
Author: taken2016,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-12 12:48:58