Java Zeit-Zone, Wenn DateFormat Parsen
Hatte ich code, der analysiert, Datum wie folgt:
String ALT_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
SimpleDateFormat sdf = new SimpleDateFormat(
ALT_DATE_TIME_FORMAT);
Date date = sdf.parse(requiredTimeStamp);
Und es war in Ordnung arbeiten, plötzlich, diese aufgehört zu arbeiten. Es stellt sich heraus, ein admin hat einige config-änderungen auf dem server, und das Datum wird derzeit als zurückgegeben "2010-12-27T10:50:44.000-08:00", die nicht analysieren können durch die oben genannten Muster. Ich habe zwei Fragen:
Das erste wäre, was Muster analysieren, das Datum wird zurückgegeben von der JVM in dem oben genannten format (genauer gesagt, nur '-08:00', wie das time zone)? Und zweitens, wo genau würde man das ändern solcher Einstellungen auf einem linux RHEL 5 server, so dass wir uns bewusst sind, solche Veränderungen in der Zukunft?
InformationsquelleAutor shipmaster | 2010-12-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Andere Anwendung ist die Verwendung der ISO-8601 dateTime-format. Ich gehe davon aus, dass die andere Anwendung senden Sie eine XML-Antwort, die in übereinstimmung mit den XML-Schema - dateTime-Typ, die ISO 8601. Nun, es ist eine bekannte Sache, dass die DateFormat können nicht Parsen dieses format. Sie müssen entweder andere Bibliotheken wie joda-time (joda-time ist der Sieger) oder die FastDateFormat wie in den anderen Antworten. Blick auf dieser post Konvertieren von ISO-8601-konformen String, java.util.Datum
Die Joda-Time-Bibliothek funktioniert, aber ist jetzt im Wartungsmodus. Das team berät die migration zu java.Zeit-Klassen.
InformationsquelleAutor Aravind R. Yarram
tl;dr
ISO 8601
Den input-string-format ist definiert in der ISO 8601 standard, eine Familie von Datum-Zeit-Formate.
Vermeiden alte Datum-Zeit-Klassen
Die Frage und andere Antworten die alten veralteten Datum-Zeit-Klassen gebündelt mit den ersten Java-Versionen. Um Sie zu vermeiden. Jetzt ersetzt durch java.Zeit-Klassen.
Mit java.Zeit
Ihre Eingabe Zeichenfolge endet mit einem offset von UTC. Also wir analysieren als
OffsetDateTime
Objekt.Java.Zeit-Klassen verwenden ISO-8601-Formate, die standardmäßig beim Parsen/generieren von strings. So dass keine Notwendigkeit, um anzugeben, ein Formatierungs-Muster.
Wenn Sie wollen, um dieses Datum-Zeit-Wert als einen moment auf der Zeitachse in UTC, extrahieren Sie eine
Instant
.Eine Zeitzone ist ein offset plus eine Reihe von Regeln für den Umgang mit Anomalien, wie Sommerzeit (DST). Wenn Sie eine Zeitzone im Auge sind, gelten ein
ZoneId
zu bekommenZonedDateTime
Objekt. Gleichen moment auf der Zeitachse, aber betrachtet man Sie durch eine andere Wand-Uhr-Zeit.Über java.Zeit
Den java.Zeit framework ist in Java 8 und höher. Diese Klassen verdrängen die lästige alte legacy Datum-Zeit-Klassen wie
java.util.Date
,Calendar
, &" = SimpleDateFormat
.Den Joda-Time Projekt, jetzt in Wartung-Modus, rät der migration auf die java.Zeit Klassen.
Um mehr zu erfahren, siehe die Oracle Tutorial. Und die Suche Stack Overflow für viele Beispiele und Erklärungen. Spezifikation JSR 310.
Können Sie exchange java.Zeit Objekte direkt mit Ihrer Datenbank. Verwenden Sie eine JDBC-Treiber kompatibel mit JDBC 4.2 oder später. Keine Notwendigkeit für Streicher, keine Notwendigkeit für
java.sql.*
Klassen.Wo erhalten Sie die java.Zeit-Klassen?
Den ThreeTen-Extra Projekt erweitert die java.mal mit zusätzlicher Klassen. Dieses Projekt ist ein Testgelände für mögliche künftige Erweiterungen zu java.Zeit. Sie finden möglicherweise einige nützliche Klassen, die hier wie
Interval
,YearWeek
,YearQuarter
, und mehr.InformationsquelleAutor Basil Bourque
Wenn Sie möchten, analysieren Sie diese mit geraden JDK, ich glaube, es sollte parseable mithilfe des JAXB utils, siehe DatatypeFactory.newXMLGregorianCalendar oder DatatypeConverter.parseDateTime.
InformationsquelleAutor jtahlborn
Verwenden JodaTime
Als ein mehr konkretes Beispiel zu @Pangea ' s Vorschlag, JodaTime, das ist, was Sie verwenden könnten:
Diese erkennt korrekt die UTC-Zeitzone. Ich habe nicht versucht es mit Millisekunden in den string timestamp, aber ich bin zuversichtlich, es wird genauso gut funktionieren.
Hoffe, das hilft anderen.
JP
Danke für den Hinweis! Wenn die mit Java SE 8+, Sie empfehlen, die sich über zu
java.time
. Glücklich zu sehen, diese Verbesserungen gebracht wird, in den Kern.Viel von java.Funktionalität ist zurück-portiert auf Java 6 & 7 in ThreeTen-Man. Weitere angepasst für Android in der ThreeTenABP Projekt.
FYI, alle diese Projekte (Joda-Time, JSR 310, java.Zeit Klassen ThreeTen-Backport und ThreeTen-Extra) geleitet werden von dem gleichen Mann, Stephen Colebourne.
InformationsquelleAutor Joshua Pinter
Dürfte die Frage sein, wo
requiredTimeStamp
kommt, und in welchem format. Ist es von einem Benutzer eingegeben, oder Lesen Sie aus einem anderen Programm? Die Komponente erstellt, die das Datum in den String-Darstellung?Format "2010-12-27T10:50:44.000-08:00" aussieht standardisierten format ISO-8601
Es sollte parseable mit dem Muster
yyyy-MM-dd'T'HH:mm:ss.SSSZ
Nicht sicher sind, welche Einstellungen beeinflussen, aber es ist ein Oracle FAQ über Java Zeitzonen.
Kann es sein
user.timezone
system-Eigenschaft oder die/etc/localtime
symlink in RHEL.InformationsquelleAutor mhaller
"=SimpleDateFormat akzeptiert nur
-0800
oderGMT-08:00
als Zeitzone.Scheint es die ISO 8601-format können nicht analysiert werden, mit
SimpleDateFormat
. Vielleicht sollten Sie einen Blick auf Apache Commons Lang's FastDateFormat. Es ist kompatibel mitSimpleDateFormat
aber akzeptiert dieZZ
Muster für die Zeitzone, die sollte analysieren die timezone-format, die Sie benötigen. DateFormatUtils enthält einige Beispiel-Konstanten, die Aussehen wie die Muster, die Sie brauchen, ohne die Millisekunden (zum Beispiel ISO_DATETIME_TIME_ZONE_FORMAT).Es scheint, Sie haben Recht. Da es implementiert das standard-Format-Schnittstelle bin ich davon ausgegangen, dass es auch Parsen des format wie " = SimpleDateFormat. Ich habe nicht überprüfen Sie die Kommentare für die parse-Methoden.
InformationsquelleAutor Reboot
Versuchen, es zu ändern, um den unteren Fall z.
z Prozesse, die meisten der Allgemeinen Zeitzone syntax, während Z verwendet strengere RFC 822-Zeitzone mit 4 stellen.
Obwohl seine dokumentiert, dass sowohl sollte analysieren "Allgemeine Zeitzone-Einstellungen', es könnte den Unterschied machen in deinem Fall.
InformationsquelleAutor jbx