Wie erhalte ich den aktuellen Moment im ISO 8601-Format mit Datum, Stunde und Minute?
322
Was ist der eleganteste Weg, um eine ISO 8601- formatierte Darstellung des aktuellen Moments UTC zu erhalten? Es sollte so aussehen:2010-10-12T08:50Z .
@ Joachim Die negative Seite dieses "Standard" -Ansatzes ist, dass ich "yyyy-MM-dd'T'HH:mmZ"jedes Mal, wenn ich ein ISO-8601-formatiertes Datum benötige, viele Instanzen in meiner Anwendung haben muss. Wie ich sehe, kann ich mit JodaTime einen vordefinierten Formatierer verwenden ISODateTimeFormat, der diese Aufgabe für mich
erledigt
8
@Joachim, Zist ein gültiges Muster in SimpleDateFormat yyyy-MM-dd'T'HH:mm'Z'.
Buhake Sindi
33
-1 Hier erhalten Sie Datum und Uhrzeit in der aktuellen Zeitzone - nicht UTC. Carlos 'Antwort enthält den erforderlichen UTC-Code.
Scott Rippey
16
Ich habe gerade den Zeitzonenfehler behoben - da dies die akzeptierte Antwort ist, denke ich, dass es das Richtige war.
BoD
2
Das Z muss wie folgt zitiert werden: "JJJJ-MM-TT'T'HH: MM'Z '"
Kimball Robinson
224
Für Systeme, bei denen die Standardzeitzone nicht UTC ist:
Das SimpleDateFormat Instanz kann bei Bedarf häufig als globale Konstante deklariert werden. Beachten Sie jedoch, dass diese Klasse nicht threadsicher ist. Es muss synchronisiert werden, wenn mehrere Threads gleichzeitig darauf zugreifen.
EDIT: Ich würde Joda Time bevorzugen, wenn ich viele verschiedene Zeit- /
Datumsmanipulationen mache ... EDIT2: korrigiert: setTimeZoneakzeptiert keinen String (korrigiert von Paul)
Dieses Format ist in keiner eingebauten Bibliothek eine Konstante?
Daniel Kaplan
Es gibt zwei verschiedene Pakete für 'DateFormat'. Denken Sie daran, 'import java.text.DateFormat' zu verwenden
oabarca
3
Wenn Sie die aktuelle Zeitzone möchten, verwenden Sie TimeZone tz = TimeZone.getDefault (); stattdessen
Oabarca
Sie sollen nicht den ‚Z‘ im Format zitieren da , dass es logisch bedeutungslos machen. Wenn die Zeitzone wie im obigen Beispiel UTC ist, führt ein nicht zitiertes Z nur zu einem Z in der Ausgabe. Wenn die Zeitzone jedoch nicht UTC ist, wird das Z weiterhin als Literal ausgegeben, das UTC impliziert, wenn die Zeit dies möglicherweise nicht tut Sein. Wenn ein konsumierendes System das Z als UTC liest, die Zeit jedoch nicht ist, wird die Zeit verschoben. Wenn umgekehrt ein Parser das angegebene Z verwendet, ohne die Zeitzone festzulegen, analysiert er die UTC-Zeiten als Ortszeiten (erneutes Verschieben). Dieses Zitat wird nicht benötigt, wenn die TZ eingestellt ist, ist aber gefährlich, wenn dies nicht der Fall ist.
Matt Whipple
@ MattWhipple - aber wenn Sie ein nicht zitiertes Z verwenden, wird das Ergebnis so etwas wie 2016-06-14T13:56+0000- die Frage fragt nach so etwas wie2016-06-14T13:56Z
user85421
183
Java 8 Native
java.time macht es einfach seit Java 8. Und thread sicher.
Sie könnten versucht sein, Feuerzeuge Temporalwie Instantoder zu verwenden LocalDateTime, aber es fehlt ihnen an Formatierungsunterstützung oder Zeitzonendaten. Funktioniert nur ZonedDateTimesofort.
Verfeinerte Anforderungen, wie das Entfernen des Sekunden-Teils, müssen weiterhin von benutzerdefinierten Formaten oder benutzerdefinierten Nachbearbeitungsprozessen erfüllt werden.
Für Java 6 und 7 können Sie Back-Ports von java.time in Betracht ziehen , z. B. ThreeTen-Backport , das auch über einen Android-Port verfügt . Beide sind leichter als Joda und haben aus Jodas Erfahrung gelernt - insb. wenn man bedenkt, dass java.time von Jodas Autor entworfen wurde.
Gute Antwort. Beachten Sie die gute Angewohnheit , eine Zeitzone explizit anzugeben, anstatt sich implizit auf die aktuelle Standardzeitzone der JVM zu verlassen. Falls gewünscht, können Sie eine bestimmte Zeitzone angeben , z ZoneId.of( "America/Montreal" ).
Basil Bourque
1
Instant ermöglicht das Formatieren im ISO 8601-Format durch einfaches Aufrufen der .toString () -Methode:return DateTimeFormatter.ISO_INSTANT.format(this);
VadymVL
Dies ist am besten, weil Sie die Standardeinstellung vermeiden.
Christophe Roussy
6
Warnung: Die Lösung für Java 8 mit ISO_INSTANT hat eine nervige Eigenart. Wenn die Millisekunden zufällig 0 sind, sind sie nicht in der Ausgabe enthalten. Dies ist gemäß der Norm ISO 8601 zulässig, aber viele Bibliotheken und Parser in anderen Sprachen sind nicht so verzeihend. Wenn immer die Nullen eingeschlossen werden müssen, verwenden Sie stattdessen Folgendes: DateTimeFormatter ISO_8601 = ofPattern ("JJJJ-MM-TT'T'HH: mm: ss.SSSX"). WithZone (UTC);
Jürgen
Nach dem Wechsel von Java 8 zu 11 sehe DateTimeFormatter.ISO_INSTANTund DateTimeFormatter.ISO_DATE_TIMEverwende ich nach den Sekunden 6 Ziffern, im Gegensatz zu 3, die von Spring's nicht mehr erfasst werden @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME).
Nun, entweder fügen Sie eine zusätzliche Bibliothek eines Drittanbieters als Abhängigkeit von Ihrem Projekt hinzu (die Sie möglicherweise auf dem neuesten Stand halten und mit Ihrer Anwendung ausliefern möchten, hey, es sind nur zusätzliche 3,2 Megabyte) und tun dies DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);, oder Sie kapseln return String.format("%tFT%<tRZ", new Date());in eine Klasse und tun str = Iso8601Time.now(), wo immer Sie es brauchen. (Es ist nicht so, dass sich das ISO-Format ändern wird.) Wenn sich herausstellt, dass Sie mehr als nur das aktuelle Datum im ISO-Format benötigen, verwenden Sie eine Bibliothek.
Aioobe
2
Stimme dem voll und ganz zu.
yegor256
3
Beachten Sie, dass es möglich ist zu ändern, welche Antwort als akzeptiert markiert ist
Dies ist die richtige Antwort, und es ist ein Skandal, dass es in all diesen Zusammenstellungen nicht höher bewertet wurde SimpleDateFormats.
David Moles
Ich bin froh, dass ich mehr Antworten gelesen habe. Ich stimme zu, dies sollte jetzt die Antwort sein.
Xan-Kun Clark-Davis
Und weil es so ist toString, müssen Sie es in vielen Fällen nicht einmal explizit aufrufen.
kaya3
1
Warnung in einem Kommentar zu einer früheren Antwort gilt auch hier: "Warnung: Die Lösung für Java 8 mit ISO_INSTANT hat eine nervige Eigenart. Wenn die Millisekunden zufällig 0 sind, werden sie nicht in die Ausgabe aufgenommen. Dies ist gemäß ISO 8601 zulässig Standard, aber viele Bibliotheken und Parser in anderen Sprachen sind nicht so verzeihend. "
Wenn Sie nicht hinzufügen möchten oder wenn Sie keinen Wert für das Hinzufügen der obigen Bibliothek sehen, können Sie SimpleDateFormatdas Datum einfach in der erstellten Klasse verwenden, um es auf das erforderliche ISO-Format zu formatieren
Und wie würden Sie einen String erzeugen, der wie in der Frage gezeigt formatiert ist?
Joachim Sauer
4
Ich würde sagen, füge keine Bibliotheksabhängigkeit für so etwas Einfaches hinzu (was mit zwei Zeilen Java-Code erreicht werden kann). (Sicher, wenn die Anforderungen wachsen, ist es eine andere Geschichte.)
Aioobe
1
@aioobe, wenn es nur in mehreren Teilen der App verwendet wird, ist es in Ordnung, die Standardeinstellung zu verwenden, im Rest ist Jodatime besser.
Jigar Joshi
5
@aioobe jodatime ist auf jeden Fall besser, weil es ISODateTimeFormat- einen vordefinierten Formatierer von ISO-8601 hat.
yegor256
3
@ org.life.java: Diese sind nur relevant, wenn Sie ordnungsgemäß zur Jode-Zeit wechseln können. Sie werden sie nicht haben, wenn Sie nur diese Funktion der Joda-Zeit verwenden.
Joachim Sauer
20
DateFormatUtils von Apache commons-lang3haben nützliche Konstanten, zum Beispiel:DateFormatUtils.ISO_DATETIME_FORMAT
Genauer gesagt, der aktuelle Moment in UTC: DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));aktueller Moment in der Standardzeitzone : DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date()); @ yegor256 danke für die Erwähnung DateFormatUtils, mit Apache commons-lang an Bord lohnt es sich, das Datumsformat zu verwenden.
Babinik
19
Wenn Sie Jodatime nicht einschließen möchten (so schön wie es ist)
Dies ist threadsicher. Joda-Time schafft neue unveränderliche Objekte anstatt vorhandene Objekte zu ändern.
Wenn Sie wirklich nach einem Format ohne Sekunden fragen möchten, das in Minuten aufgelöst wird, verwenden Sie einen der vielen anderen in Joda-Time integrierten Formatierer.
DateTime now =newDateTime(DateTimeZone.UTC );String output =ISODateTimeFormat.dateHourMinute.print( now );
java.time
Für Java 8 und höher funktioniert Joda-Time weiterhin. Aber die eingebaute java.time Framework ersetzt jedoch Joda-Time. Migrieren Sie also Ihren Code so schnell wie möglich von Joda-Time zu java.time.
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.
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 .
Sie können Java SimpleDateFormat mit dem folgenden Muster yyyy-MM-dd'T'HH:mm:ssXXXfür ISO 8601 verwenden.
Beispielcode: (listet alle verfügbaren Zeitzonen auf)
for(String timeZone :TimeZone.getAvailableIDs()){DateFormat dateFormat =newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssXXX");
dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));String formatted = dateFormat.format(newDate());System.out.print(formatted);if(formatted.endsWith("Z")){// These time zone's have offset of '0' from GMT.System.out.print("\t("+ timeZone +")");}System.out.println();}
Wenn Sie die aktuelle Uhrzeit anzeigen möchten, müssen Sie kein altmodisches DateObjekt durchgehen . Tu es einfach Instant.now().toString(). Wenn Sie eine Datevon einer Legacy-API erhalten haben, ist Ihre Methode die beste.
Einige der anderen Antworten empfehlen Java.time- Klassen korrekt, verwenden jedoch unnötige Längen für Ihre spezifischen Anforderungen.
Instant.now()// Capture the current moment in UTC with a resolution as fines nanoseconds but usually in microseconds or milliseconds..truncatedTo(ChronoUnit.MINUTES )// Lop off any seconds or fractional second, to get a value in whole minutes..toString()// Generate a String in standard ISO 8601 format where a `T` separates the year-month-day from the hour-minute-second, and the `Z` on the end for “Zulu” means UTC.
2018-01-23T12: 34Z
Instant::toString
Die jav.time.InstantKlasse repräsentiert einen Moment in UTC, immer in UTC.
Die Zam Ende Ihrer Beispielzeichenfolge 2010-10-12T08:50Zwird "Zulu" ausgesprochen und bedeutet UTC .
Ihr gewünschtes Format entspricht zufällig der Norm ISO 8601 . Die java.time- Klassen verwenden diese Standardformate standardmäßig beim Parsen / Generieren von Zeichenfolgen. Sie müssen also kein Formatierungsmuster angeben. Ruf einfach anInstant::toString wie oben gezeigt an.
Wenn Sie speziell ganze Minuten ohne Sekunde oder Sekundenbruchteil möchten, schneiden Sie diese ab. Geben Sie eine Zeiteinheit über die ChronoUnitKlasse an.
Instant instant =Instant.now().truncatedTo(ChronoUnit.MINUTES );String output = instant.toString();// Generate a `String` object in standard ISO 8601 format.
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.
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 .
Das statische Erstellen kann zu Problemen führen, da SimpleDateFormat nicht threadsicher ist: "Datumsformate werden nicht synchronisiert. Es wird empfohlen, separate Formatinstanzen für jeden Thread zu erstellen. Wenn mehrere Threads gleichzeitig auf ein Format zugreifen, muss es extern synchronisiert werden." docs.oracle.com/javase/7/docs/api/java/text/…
Juha Palomäki
2
Wie @Juha Palomäki erwähnte, ist dies nicht threadsicher. Wenn Sie Java 8 oder höher verwenden, kann ThreadLocal.withInitial dies beheben. Wenn Sie Java 7 oder niedriger verwenden, erstellen Sie ein neues ThreadLocal und geben Sie einen Anfangswert an, indem Sie ThreadLocal.initialValue
user393274 vom
@ user393274 - wenn Sie 8 verwenden Java sollten Sie verwenden Instant, DateTimeFormatund der andere modernen Thread - sicher Ersatz
Ich bin ein bisschen verwirrt darüber, was das Problem ist, dass SimpleDateFormat nicht threadsicher ist. Wenn zwei Threads den statischen Initialisierer gleichzeitig ausführen, kann ich nichts Schlimmeres sehen, als dass der SimpleDateFormat-Konstruktor zweimal aufgerufen wird, aber nur ein Moment davon (der letzte, der beendet wird) wird als "df" aufgezeichnet.
Gilbertpilz
2
privatestaticString getCurrentDateIso(){// Returns the current date with the same format as Javascript's new Date().toJSON(), ISO 8601DateFormat dateFormat =newSimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",Locale.US);
dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));return dateFormat.format(newDate());}
Trotzdem unterstützt joda-time nur das erweiterte Format: "2015-12-09T00: 22: 42.930Z", nicht das grundlegende: "20151209T002242.930Z" ... wir sollten eine Liste von Formaten besser mit Java SimpleDateFormat testen.
Ich habe es in Android mit Calendar und SimpleDateFormat gemacht. Die folgende Methode gibt einen Kalender mit der Zeitzone "GMT" zurück (dies ist die universelle Zeitzone). Anschließend können Sie mit der Calendar-Klasse die Stunde zwischen verschiedenen Zeitzonen mithilfe der Methode setTimeZone () der Calendar-Klasse festlegen.
ERINNERN SIE SICH: Die Date-Klasse kennt die TimeZone-Existenz nicht. Wenn Sie ein Datum debuggen, wird aus diesem Grund immer das Datum für Ihre aktuelle Zeitzone angezeigt.
Wenn Sie Wert auf Leistung legen , habe ich eine Bibliothek erstellt, die den Standard-Java-Parser und -Formatierer bei der Bearbeitung mit ISO8601-formatierten Daten übertrifft. DatetimeProcessor-Implementierungen sind threadsicher und können in einer gleichzeitigen Zuordnung oder in statischen Feldern zwischengespeichert werden.
Sie sollten eine einfache Möglichkeit hinzugefügt haben, von Datum zu Sofort zu wechseln, und auch eine Methode namens toISO8601, nach der viele Leute suchen. Als Ergänzung zu anderen Antworten von java.util.Date bis ISO 8601:
Instant.ofEpochMilli(date.getTime()).toString();
Es ist nicht wirklich sichtbar, wenn die automatische Vervollständigung verwendet wird, aber
java.time.Instant.toString()::
Eine Zeichenfolgendarstellung dieses Augenblicks unter Verwendung von ISO-8601
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
private static SimpleDateFormat
nicht threadsicher ist.Antworten:
Verwenden Sie
SimpleDateFormat
diese Option, um ein beliebigesDate
Objekt zu formatieren :Wenn Sie a
new Date()
wie oben gezeigt verwenden, wird die aktuelle Uhrzeit formatiert.quelle
"yyyy-MM-dd'T'HH:mmZ"
jedes Mal, wenn ich ein ISO-8601-formatiertes Datum benötige, viele Instanzen in meiner Anwendung haben muss. Wie ich sehe, kann ich mit JodaTime einen vordefinierten Formatierer verwendenISODateTimeFormat
, der diese Aufgabe für michZ
ist ein gültiges Muster in SimpleDateFormatyyyy-MM-dd'T'HH:mm'Z'
.Für Systeme, bei denen die Standardzeitzone nicht UTC ist:
Das
SimpleDateFormat
Instanz kann bei Bedarf häufig als globale Konstante deklariert werden. Beachten Sie jedoch, dass diese Klasse nicht threadsicher ist. Es muss synchronisiert werden, wenn mehrere Threads gleichzeitig darauf zugreifen.EDIT: Ich würde Joda Time bevorzugen, wenn ich viele verschiedene Zeit- /
Datumsmanipulationen mache ... EDIT2: korrigiert:
setTimeZone
akzeptiert keinen String (korrigiert von Paul)quelle
2016-06-14T13:56+0000
- die Frage fragt nach so etwas wie2016-06-14T13:56Z
Java 8 Native
java.time macht es einfach seit Java 8. Und thread sicher.
Ergebnis:
2015-04-14T11:07:36.639Z
Durch Optimieren oder Verketten der Optionen / Vorgänge von ZonedDateTime und DateTimeFormatter können Sie die Zeitzone und Genauigkeit bis zu einem gewissen Grad einfach steuern :
Ergebnis:
2015-04-14T11:07:00+01:00[Europe/Paris]
Verfeinerte Anforderungen, wie das Entfernen des Sekunden-Teils, müssen weiterhin von benutzerdefinierten Formaten oder benutzerdefinierten Nachbearbeitungsprozessen erfüllt werden.
quelle
ZoneId.of( "America/Montreal" )
.return DateTimeFormatter.ISO_INSTANT.format(this);
DateTimeFormatter.ISO_INSTANT
undDateTimeFormatter.ISO_DATE_TIME
verwende ich nach den Sekunden 6 Ziffern, im Gegensatz zu 3, die von Spring's nicht mehr erfasst werden@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
.Java 8:
Vor Java 8:
Aus den Dokumenten :
quelle
DateTime dt = new DateTime(); DateTimeFormatter fmt = ISODateTimeFormat.dateTime(); String str = fmt.print(dt);
, oder Sie kapselnreturn String.format("%tFT%<tRZ", new Date());
in eine Klasse und tunstr = Iso8601Time.now()
, wo immer Sie es brauchen. (Es ist nicht so, dass sich das ISO-Format ändern wird.) Wenn sich herausstellt, dass Sie mehr als nur das aktuelle Datum im ISO-Format benötigen, verwenden Sie eine Bibliothek.%tFT%<tTZ
wird Sekunden enthalten;%tFT%<tTZ.%<tL
wird Millisekunden enthalten.Ab Java 8 können Sie einfach:
Aus den
java.time.Instant
Dokumenten:quelle
SimpleDateFormats
.toString
, müssen Sie es in vielen Fällen nicht einmal explizit aufrufen.benutze JodaTime
Hier ist das Dokument für JodaTime Formatter
Bearbeiten:
Wenn Sie nicht hinzufügen möchten oder wenn Sie keinen Wert für das Hinzufügen der obigen Bibliothek sehen, können Sie
SimpleDateFormat
das Datum einfach in der erstellten Klasse verwenden, um es auf das erforderliche ISO-Format zu formatierenwie von @Joachim Sauer vorgeschlagen
quelle
ISODateTimeFormat
- einen vordefinierten Formatierer von ISO-8601 hat.DateFormatUtils von Apache
commons-lang3
haben nützliche Konstanten, zum Beispiel:DateFormatUtils.ISO_DATETIME_FORMAT
quelle
DateFormatUtils.format(new Date(), "yyyy-MM-dd'T'HH:mm'Z'", TimeZone.getTimeZone("UTC"));
aktueller Moment in der Standardzeitzone :DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT.format(new Date())
; @ yegor256 danke für die ErwähnungDateFormatUtils
, mit Apache commons-lang an Bord lohnt es sich, das Datumsformat zu verwenden.Wenn Sie Jodatime nicht einschließen möchten (so schön wie es ist)
Dies gibt eine Zeichenfolge von:
Dies unterscheidet sich geringfügig von der ursprünglichen Anforderung, ist jedoch immer noch ISO-8601.
quelle
ISO 8601 kann Sekunden enthalten, siehe http://en.wikipedia.org/wiki/ISO_8601#Times
so sollte der Code sein
quelle
Joda-Zeit
Update: Das Joda-Time- Projekt befindet sich jetzt im Wartungsmodus. Das Team empfiehlt die Migration zu den Klassen java.time . Informationen zu Java 6 und 7 finden Sie im ThreeTen-Backport- Projekt, das im ThreeTenABP für Android weiter angepasst wurde Projekt.
Verwenden der Joda-Time- Bibliothek…
Dies ist threadsicher. Joda-Time schafft neue unveränderliche Objekte anstatt vorhandene Objekte zu ändern.
Wenn Sie wirklich nach einem Format ohne Sekunden fragen möchten, das in Minuten aufgelöst wird, verwenden Sie einen der vielen anderen in Joda-Time integrierten Formatierer.
java.time
Für Java 8 und höher funktioniert Joda-Time weiterhin. Aber die eingebaute java.time Framework ersetzt jedoch Joda-Time. Migrieren Sie also Ihren Code so schnell wie möglich von Joda-Time zu java.time.
Siehe meine andere Antwort für eine moderne Lösung.
Ü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 auf java.time Klassen .
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
Für Java Version 7
Sie können der Oracle-Dokumentation folgen: http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html
X - wird für die Zeitzone ISO 8601 verwendet
quelle
Sie können Java SimpleDateFormat mit dem folgenden Muster
yyyy-MM-dd'T'HH:mm:ssXXX
für ISO 8601 verwenden.Du könntest benutzen:
für die Standard-VM-Zeitzone. Mehr hier
Möglicherweise bemerken Sie die Datums- und Uhrzeitangabe für einige Zeitzonen, die mit enden
'Z'
. Diese Zeitzonen haben einen Versatz von'0'
von GMT.Weitere Infos finden Sie hier .
quelle
Ich glaube, der einfachste Weg ist, zuerst zum Instant und dann zum String zu gehen wie:
Was dazu führen wird:
2017-09-08T12:56:45.331Z
quelle
Date
Objekt durchgehen . Tu es einfachInstant.now().toString()
. Wenn Sie eineDate
von einer Legacy-API erhalten haben, ist Ihre Methode die beste.java.util.Date
,java.util.Calendar
undjava.text.SimpleDateFormat
ist jetzt Erbe , durch die verdrängte java.time Klassen in Java gebaut 8 und höher. Siehe Tutorial von Oracle .tl; dr
Einige der anderen Antworten empfehlen Java.time- Klassen korrekt, verwenden jedoch unnötige Längen für Ihre spezifischen Anforderungen.
Instant::toString
Die
jav.time.Instant
Klasse repräsentiert einen Moment in UTC, immer in UTC.Die
Z
am Ende Ihrer Beispielzeichenfolge2010-10-12T08:50Z
wird "Zulu" ausgesprochen und bedeutet UTC .Ihr gewünschtes Format entspricht zufällig der Norm ISO 8601 . Die java.time- Klassen verwenden diese Standardformate standardmäßig beim Parsen / Generieren von Zeichenfolgen. Sie müssen also kein Formatierungsmuster angeben. Ruf einfach an
Instant::toString
wie oben gezeigt an.Wenn Sie speziell ganze Minuten ohne Sekunde oder Sekundenbruchteil möchten, schneiden Sie diese ab. Geben Sie eine Zeiteinheit über die
ChronoUnit
Klasse an.Ü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 auf java.time Klassen .
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
Hier ist eine ganze Klasse, die so optimiert ist, dass das Aufrufen von "now ()" nichts mehr bewirkt, als es zu tun hat.
quelle
Instant
,DateTimeFormat
und der andere modernen Thread - sicher Ersatzquelle
Trotzdem unterstützt joda-time nur das erweiterte Format: "2015-12-09T00: 22: 42.930Z", nicht das grundlegende: "20151209T002242.930Z" ... wir sollten eine Liste von Formaten besser mit Java SimpleDateFormat testen.
quelle
Ich habe es in Android mit Calendar und SimpleDateFormat gemacht. Die folgende Methode gibt einen Kalender mit der Zeitzone "GMT" zurück (dies ist die universelle Zeitzone). Anschließend können Sie mit der Calendar-Klasse die Stunde zwischen verschiedenen Zeitzonen mithilfe der Methode setTimeZone () der Calendar-Klasse festlegen.
ERINNERN SIE SICH: Die Date-Klasse kennt die TimeZone-Existenz nicht. Wenn Sie ein Datum debuggen, wird aus diesem Grund immer das Datum für Ihre aktuelle Zeitzone angezeigt.
quelle
Wenn Sie Wert auf Leistung legen , habe ich eine Bibliothek erstellt, die den Standard-Java-Parser und -Formatierer bei der Bearbeitung mit ISO8601-formatierten Daten übertrifft. DatetimeProcessor-Implementierungen sind threadsicher und können in einer gleichzeitigen Zuordnung oder in statischen Feldern zwischengespeichert werden.
quelle
Sie sollten eine einfache Möglichkeit hinzugefügt haben, von Datum zu Sofort zu wechseln, und auch eine Methode namens
toISO8601
, nach der viele Leute suchen. Als Ergänzung zu anderen Antworten von java.util.Date bis ISO 8601:Es ist nicht wirklich sichtbar, wenn die automatische Vervollständigung verwendet wird, aber
java.time.Instant.toString()
::quelle
quelle
Versuche dies,
Es ist für ISO 8601 Format
quelle