Ich habe eine Datumszeichenfolge und möchte sie mithilfe der Java-Datums-API auf das normale Datum analysieren. Folgendes ist mein Code:
public static void main(String[] args) {
String date="2010-10-02T12:23:23Z";
String pattern="yyyy-MM-ddThh:mm:ssZ";
SimpleDateFormat sdf=new SimpleDateFormat(pattern);
try {
Date d=sdf.parse(date);
System.out.println(d.getYear());
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Ich habe jedoch eine Ausnahme: java.lang.IllegalArgumentException: Illegal pattern character 'T'
Ich frage mich also, ob ich den String teilen und manuell analysieren muss.
Übrigens habe ich versucht, auf beiden Seiten des T ein einfaches Anführungszeichen einzufügen:
String pattern="yyyy-MM-dd'T'hh:mm:ssZ";
Es funktioniert auch nicht.
java
date
simpledateformat
iso8601
hguser
quelle
quelle
T
steht für Zeit und ist Teil des ISO8601- Standards für die internationale Formatierung von Datum und Uhrzeit.T
einfachen Anführungszeichen hat bei mir funktioniert (zumindest im Hinblick auf die Lösung des Analysefehlers).Antworten:
Update für Java 8 und höher
Sie können jetzt einfach
Instant.parse("2015-04-28T14:23:38.521Z")
das Richtige tun und erhalten, zumal SieInstant
anstelle derjava.util.Date
mit den neuesten Versionen von Java defekten verwenden sollten .Sie sollten
DateTimeFormatter
stattdessenSimpleDateFormatter
auch verwenden.Ursprüngliche Antwort:
Dies funktioniert mit der Eingabe mit dem Trailing
Z
wie gezeigt:Q2597083.java
Erzeugt die folgende Ausgabe:
quelle
tl; dr
Verwenden Sie
java.time.Instant
class, um Text im Standardformat ISO 8601 zu analysieren, der einen Moment in UTC darstellt.ISO 8601
Dieses Format ist in der Norm ISO 8601 für Datums- und Uhrzeitzeichenfolgenformate definiert.
Beide:
… Verwenden standardmäßig ISO 8601-Formate zum Parsen und Generieren von Zeichenfolgen.
Sie sollten generell vermeiden, die alten Klassen java.util.Date /.Calendar & java.text.SimpleDateFormat zu verwenden, da diese notorisch problematisch, verwirrend und fehlerhaft sind. Bei Bedarf für die Zusammenarbeit können Sie hin und her konvertieren.
java.time
In Java 8 und höher ist das neue java.time- Framework integriert. Inspiriert von Joda-Time , definiert durch JSR 310 und erweitert durch das ThreeTen-Extra- Projekt.
In die alte Klasse konvertieren.
Zeitzone
Bei Bedarf können Sie eine Zeitzone zuweisen.
Konvertieren.
Joda-Zeit
UPDATE: Das Joda-Time-Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time .
Hier ist ein Beispielcode in Joda-Time 2.8.
In alte Klasse konvertieren. Beachten Sie, dass die zugewiesene Zeitzone bei der Konvertierung verloren geht, da juDate keine Zeitzone zugewiesen werden kann.
Zeitzone
Bei Bedarf können Sie eine Zeitzone zuweisen.
Über java.time
Das java.time- Framework ist in Java 8 und höher integriert. Diese Klassen verdrängen die lästigen alten Legacy - Datum-Zeit - Klassen wie
java.util.Date
,Calendar
, &SimpleDateFormat
.Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen java.time .
Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Sie können java.time- Objekte direkt mit Ihrer Datenbank austauschen . Verwenden Sie einen JDBC-Treiber, der mit JDBC 4.2 oder höher kompatibel ist . Keine Notwendigkeit für Zeichenfolgen, keine Notwendigkeit für
java.sql.*
Klassen.Woher bekomme ich die java.time-Klassen?
Das ThreeTen-Extra- Projekt erweitert java.time um zusätzliche Klassen. Dieses Projekt ist ein Testfeld für mögliche zukünftige Ergänzungen von java.time. Sie können einige nützliche Klassen hier wie finden
Interval
,YearWeek
,YearQuarter
, und mehr .quelle
Es gibt zwei Antworten über up-to-jetzt und sie sind sowohl lang (und tl; dr zu kurz IMHO), so dass ich Zusammenfassung aus meiner Erfahrung schreiben beginne neu zu verwenden java.time Bibliothek (anwendbar wie in anderen Antworten auf Java - Version festgestellt 8+). ISO 8601 legt die Standardmethode zum Schreiben von Datumsangaben fest.
YYYY-MM-DD
Daher ist das Format der Datums- und Uhrzeitangabe nur wie folgt (kann 0, 3, 6 oder 9 Stellen für Millisekunden sein) und es ist keine Formatierungszeichenfolge erforderlich:Ich brauchte es nicht, aber da das Abrufen des Jahres im Code der Frage enthalten ist:
Es ist schwieriger, kann nicht
Instant
direkt ausgeführt werden, kann überCalendar
Fragen erfolgen. Holen Sie sich den ganzzahligen Wert des aktuellen Jahres in Java und konvertieren Sie Java. Zeit bis zum Kalender, aber IMHO als Format ist fester Teilstring ist einfacher zu verwenden:quelle