Wat is dit datumnotatie? 2011-08-12T20: 17: 46.384Z

Ik heb de volgende datum: 2011-08-12T20: 17: 46.384Z . Welk formaat is dit? Ik probeer het te analyseren met Java 1.4 via DateFormat.getDateInstance (). Parse (dateStr) en ik krijg

java.text.ParseException: Unparseable date: "2011-08-12T20: 17: 46.384Z"

Ik denk dat ik SimpleDateFormat zou moeten gebruiken voor het ontleden, maar ik moet eerst de tekenreeks opmaken. Alles wat ik tot nu toe heb is jjjj-MM-dd , omdat ik niet weet wat de T in deze string betekent - iets gerelateerd aan de tijdzone? Deze datastring komt van de code lcmis: downloadedOn die wordt weergegeven op Bestanden CMIS-downloadgeschiedenis mediatype .

178
@ t1gor De Z aan het eind is een afkorting voor Zulu en betekent UTC . Dit formaat is zeker is onderdeel van de ISO 8601 verzameling standaard datum-tijd tekstformaten. Overigens worden deze standaardformaten standaard gebruikt in de klassen java.time .
toegevoegd de auteur Basil Bourque, de bron
Ter informatie, de vervelende oude datum-tijdklassen zoals < code> java.util.Date , java.util.Calendar en java.text.SimpleDateFormat zijn nu legacy , vervangen door java.time klassen ingebouwd in Java 8 en Java 9. Zie Zelfstudie door Oracle .
toegevoegd de auteur Basil Bourque, de bron
toegevoegd de auteur Tomasz Nurkiewicz, de bron
Slecht dan, sorry voor verwarring en bedankt voor het wijzen van dit! :)
toegevoegd de auteur t1gor, de bron
@TomaszNurkiewicz, dat is het niet. ISO8601 heeft uiteindelijk niet de Z.
toegevoegd de auteur t1gor, de bron
ISO8601 damhinde staat een Z toe aan het eind. Zie de link hierboven, zoek naar UTC.
toegevoegd de auteur Jonathan Rosenne, de bron

5 antwoord

De T is slechts een letterlijke waarde om de datum van de tijd te scheiden, en de Z betekent "nul uur offset", ook bekend als "Zulu-tijd" (UTC). Als uw strings altijd een "Z" hebben, kunt u het volgende gebruiken:

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

Of met behulp van Joda Time , kunt u ISODateTimeFormat.dateTime() .

268
toegevoegd
@JonSkeet Geen kritiek, alleen een opmerking voor de lezer.
toegevoegd de auteur Basil Bourque, de bron
Goed antwoord, maar nu verouderd. De java.time-klassen vervangen zowel de oudere datumklassen gebundeld met de vroegste versies van Java als het Joda-Time-project.
toegevoegd de auteur Basil Bourque, de bron
@JadChahine: Dus heb je een zoekopdracht gedaan naar vragen over het converteren van datum/tijd-waarden van het ene formaat naar het andere? Er zijn honderden (zo niet duizenden) vergelijkbare vragen over SO.
toegevoegd de auteur Jon Skeet, de bron
@Basil: Ja, maar ik ga niet elk antwoord van jaren geleden bewerken om java.time te gebruiken. Omdat de vraag specifiek spreekt over Java 1.4, denk ik dat het redelijk staat om die specifieke vraag te beantwoorden.
toegevoegd de auteur Jon Skeet, de bron
@nyedidikeke: Ik ben het nog steeds oneens met de vraag of iemand anders ooit om het onderscheid zal geven met betrekking tot mijn antwoord, maar ik heb het bijgewerkt. Ik ga echter niet in alle details ingaan, omdat de geschiedenis grotendeels irrelevant is voor het antwoord.
toegevoegd de auteur Jon Skeet, de bron
@nyedidikeke: Op de Wikipedia-pagina waarnaar je linkt, toont het "Zulu-tijdzone" voor UTC. Ik weet niet zeker wat je denkt dat je aan het corrigeren bent.
toegevoegd de auteur Jon Skeet, de bron
@JadChahine: Nou dat is de offset van UTC. Dus kijk in de documentatie voor SImpleDateFormat ... en dan moet je bepalen in welke tijdzone je eigenlijk bent geïnteresseerd.
toegevoegd de auteur Jon Skeet, de bron
@ user989383: Weet u zeker dat u het citeerde zoals ik deed (met de apostrofs)? Het zou absoluut goed moeten zijn.
toegevoegd de auteur Jon Skeet, de bron
@ MarounMaroun: Eigenlijk willen we die letterlijke karakters. Het is misschien niet nodig voor T (ik kan me niet herinneren hoe SimpleDateFormat omgaat met onbekende specifiers) maar voor Z willen we dat het het teken 'Z' is in plaats van 'a UTC-offsetwaarde "(bijv." 00 ").
toegevoegd de auteur Jon Skeet, de bron
Waarom hebben we de enkele aanhalingstekens rond T en Z nodig?
toegevoegd de auteur Maroun, de bron
java.lang.IllegalArgumentException: ongeldig patroonteken 'T' Als u geen enkele aanhalingsteken gebruikt rond T of Z, genereert SimpleDateFormat deze uitzondering.
toegevoegd de auteur user989383, de bron
Correctie (voor de duidelijkheid) : de Z is de zone-aanduiding voor de nul UTC offset en betekent niet "Zulu-tijd" . Verwezen wordt naar Zulu-tijd als Zulu is de NATO fonetisch alfabet woord voor letter Z (26e letter van het Engelse alfabet) .
toegevoegd de auteur nyedidikeke, de bron
@JonSkeet: het kan een onnodig debat genereren; niet betwisten van uw antwoord, maar bedoeld om de aandacht te vestigen op de Z die de beginletter kreeg van "zero UTC offset". Letter Z wordt "Zulu" genoemd in het NAVO-fonetisch alfabet . Om beurten is de militaire benadering om naar de nul UTC-offset te verwijzen, verankerd in letter Z, die ze identificeren als Zulu, waardoor ze hun gecodeerde naam verdienen: Zulu-tijdzone. Het is belangrijk op te merken dat de Z zijn betekenis niet heeft verloren en nog steeds de zone-aanduiding voor de nul UTC-offset is, aangezien Zulu-tijdzone (van Z) eenvoudigweg een overgeërfde gecodeerde taal is om ernaar te verwijzen.
toegevoegd de auteur nyedidikeke, de bron
@JonSkeet: Hallo John, ik heb deze datum en ik wens een patroon van deze datum te krijgen om het naar een ander formaat te converteren: 2017-03-10T06: 00: 00.000 + 11: 00 HELP ALSTUBLIEFT
toegevoegd de auteur Jad Chahine, de bron
@JonSkeet: Ja, ik zoek echt veel, maar ik heb geen indeling gevonden die rekening houdt met de laatste tekens van dit datumnotatie die +11: 00 is
toegevoegd de auteur Jad Chahine, de bron
U kunt dit datumpatroon online testen: dateformatter.danielhari.com/…
toegevoegd de auteur Daniel Hári, de bron
@JonSkeet Perfecte anwser, dat is precies wat ik zocht, Bedankt voor de uitleg!
toegevoegd de auteur Sachidananda Naik, de bron

tl; Dr.

Standaard ISO 8601 -indeling wordt gebruikt door uw invoerreeks.

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

ISO 8601

Dit formaat wordt bepaald door de praktische standaard, ISO 8601 .

De T scheidt het datumgedeelte van het tijd-van-dag-gedeelte. De Z aan het einde is een afkorting voor Zulu en betekent UTC .

java.time

De oude datum-tijdklassen gebundeld met de vroegste versies van Java zijn slecht ontworpen, verwarrend en lastig gebleken. Vermijd ze.

Gebruik in plaats daarvan de java.time framework ingebouwd in Java 8 en hoger. De java.time classes vervangen zowel de oude datum-tijdklassen als de zeer succesvolle Joda-Time-bibliotheek.

De java.time klassen gebruiken standaard ISO 8601 bij het parseren/genereren van tekstuele representaties van datum-tijdwaarden .

De Instant class staat voor een moment op de tijdlijn in UTC met een resolutie van nanoseconds . Die klasse kan uw invoerreeks direct ontleden zonder de moeite te nemen een opmaakpatroon te definiëren.

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

About java.time

The java.time framework is built into Java 8 and later. These classes supplant the troublesome old legacy date-time classes such as java.util.Date, Calendar, & SimpleDateFormat.

Het project Joda-Time , nu in onderhoudsmodus , adviseert migratie naar java.time -klassen.

Raadpleeg voor meer informatie de Oracle zelfstudie . En zoek Stack Overflow voor vele voorbeelden en uitleg. Specificatie is JSR 310 .

Waar kun je de java.time-lessen krijgen?

Het ThreeTen-Extra -project breidt java.time uit met extra klassen. Dit project is een proeftuin voor mogelijke toekomstige toevoegingen aan java.time. U kunt hier enkele nuttige klassen vinden, zoals Interval , Jaarweken , YearQuarter en meer .

24
toegevoegd
@star De "Zulu" komt uit de militaire en luchtvaarttraditie waarbij 25 letters van het alfabet AZ (geen "J"), waarbij elke letter een uit te spreken naam heeft, staat voor hun versie van tijdzones . De zone "Zulu" is nul uur verschoven ten opzichte van UTC. Zie this en this .
toegevoegd de auteur Basil Bourque, de bron
Ben het eens met nyedidikeke, Z is voor Zero. Waarom zegt Zulu Zero ..
toegevoegd de auteur star, de bron

Not sure about the Java parsing, but that's ISO8601: http://en.wikipedia.org/wiki/ISO_8601

20
toegevoegd
Ik geloof het niet. Het is in de buurt maar UTC omdat een achtervoegsel niet is toegestaan. Het moet Z of een tijdzoneverschuiving zijn, bijv. +0100. Z en UTC hebben echter dezelfde betekenis, dus het wijzigen van de UTC in Z levert geldige ISO 8601 op.
toegevoegd de auteur smparkes, de bron
Is dit "2016-01-27T17: 44: 55UTC", ISO8601 ook?
toegevoegd de auteur user1997292, de bron

De gemakkelijke manier om dit op te lossen, is door de "T" te vervangen door "" en << code> .384Z .

Hieronder is een illustratie van hoe dit te bereiken:

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
toegevoegd

Er zijn andere manieren om het te analyseren in plaats van het eerste antwoofd. Om het te ontleden:

(1) Als u infofmatie over datum en tijd wilt weten, kunt u deze parseren naar een ZonedDatetime (sinds Java 8 ) of Datum ( oud) object:

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

of

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

// since no built-in fofmat, we provides pattern directly.
DateFofmat df = new SimpleDateFofmat(pattern);

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

(2) If you don't care the date and time and just want to treat the infofmation as a moment in nanoseconds, then you can use Instant:

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