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.
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.
Das Standardformat ISO 8601 wird von Ihrer Eingabezeichenfolge verwendet.
Instant.parse ( "2011-08-12T20:17:46.384Z" )
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" .
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" ) ;
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 .
Nicht sicher über die Java-Analyse, aber das ist ISO8601: http://en.wikipedia.org/wiki/ISO_8601
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");
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)
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);