it-swarm.com.de

Was ist dieses Datumsformat? 2011-08-12T20: 17: 46.384Z

Ich habe folgendes Datum: 2011-08-12T20:17:46.384Z. Welches Format ist das? Ich versuche es mit Java 1.4 über DateFormat.getDateInstance().parse(dateStr) zu analysieren und bekomme es

Java.text.ParseException: Datum, an dem das Datum nicht analysiert werden kann: "2011-08-12T20: 17: 46.384Z"

Ich denke, ich sollte SimpleDateFormat zum Parsen verwenden, aber ich muss die Formatzeichenfolge zuerst kennen. Alles, was ich bisher habe, ist yyyy-MM-dd, weil ich nicht weiß, was die T in diesem String bedeutet - etwas Zeitzonenbezogenes? Diese Datumszeichenfolge stammt von dem lcmis:downloadedOn-Tag, das auf dem Medientyp Files CMIS-Downloadprotokoll angezeigt wird.

234
Sarah Vessels

Das T ist nur ein Literal, um das Datum von der Zeit zu trennen, und das Z bedeutet "Null-Stunden-Offset", auch als "Zulu-Zeit" (UTC) bezeichnet. Wenn Ihre Zeichenfolgen always ein "Z" haben, können Sie Folgendes verwenden:

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

Oder mit Joda Time können Sie ISODateTimeFormat.dateTime() verwenden.

325
Jon Skeet

tl; dr

Das Standardformat ISO 8601 wird von Ihrer Eingabezeichenfolge verwendet.

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

ISO 8601

Dieses Format wird durch die sinnvolle praktische Norm ISO 8601 definiert.

Das T trennt den Datumsanteil vom Tageszeitanteil. Das Z am Ende bedeutet UTC (dh ein Versatz von UTC von null Stunden-Minuten-Sekunden). Das Z ist ausgesprochen "Zulu" .

Java.time

Die alten Date-Time-Klassen, die mit den frühesten Versionen von Java) gebündelt sind, haben sich als schlecht designt, verwirrend und problematisch erwiesen. Vermeiden Sie sie.

Verwenden Sie stattdessen das in Java 8 und höher) integrierte Java.time -Framework. Die Java.time-Klassen ersetzen sowohl die alten Datum-Uhrzeit-Klassen als auch die sehr erfolgreichen Joda- Zeitbibliothek.

Die Java.time-Klassen verwenden standardmäßig ISO 8601 , wenn sie Textdarstellungen von Datums-/Zeitwerten analysieren/generieren.

Die Klasse Instant repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden . Diese Klasse kann Ihre Eingabezeichenfolge direkt analysieren, ohne ein Formatierungsmuster definieren zu müssen.

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

About Java.time

Das Java.time Framework ist in Java 8 und höher. Diese Klassen ersetzen das lästige alte Legacy Datum-Zeit-Klassen wie Java.util.Date , Calendar , & SimpleDateFormat .

Das Joda-Time -Projekt, das sich jetzt im Wartungsmodus befindet, rät zur Migration in die Java.time -Klassen.

Weitere Informationen finden Sie im Oracle Tutorial . Durchsuchen Sie Stack Overflow nach vielen Beispielen und Erklärungen. Spezifikation ist JSR 31 .

Woher bekommen Sie die Java.time-Klassen?

Das Projekt ThreeTen-Extra erweitert Java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von Java.time. Hier finden Sie möglicherweise einige nützliche Klassen wie Interval , YearWeek , YearQuarter und mehr .

50
Basil Bourque

Nicht sicher über die Java-Analyse, aber das ist ISO8601: http://en.wikipedia.org/wiki/ISO_8601

24
smparkes

Es gibt andere Möglichkeiten, es zu analysieren als die erste Antwort. Um es zu analysieren:

(1) Wenn Sie Informationen zu Datum und Uhrzeit abrufen möchten, können Sie diese in eine ZonedDatetime (seit Java 8 ) oder Date (alt) Objekt parsen:

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

oder

// '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) Wenn Ihnen Datum und Uhrzeit egal sind und Sie die Informationen nur als Moment in Nanosekunden behandeln möchten, können Sie Instant verwenden:

// 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");
3
VeryLazyBoy

Diese Technik übersetzt Java.util.Date in das UTC-Format (oder in ein beliebiges anderes) und wieder zurück.

Definieren Sie eine Klasse wie folgt:

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

}

Dann benutze es so:

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

oder

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

Sie können bei Bedarf auch andere Datumsformate definieren (nicht nur UTC)

0
Gapmeister66

Sie können das folgende Beispiel verwenden.

    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);
0
Salih Kesepara