Ich versuche, einen Instant zu einem String mit der neuen Java 8-Zeit-API und einem Muster zu formatieren:
Instant instant = ...;
String out = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(instant);
Mit dem obigen Code erhalte ich eine Ausnahme, die ein nicht unterstütztes Feld beschwert:
java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
at java.time.Instant.getLong(Instant.java:608)
at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
...
yyyy-MM-dd hh:mm:ss
Format:DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss").withZone(ZoneId.of("Europe/Paris"));
quelle
Dies erspart Ihnen die Konvertierung in UTC. Die Zeitrahmen einiger anderer Sprachen unterstützen die Millisekunden möglicherweise nicht, daher sollten Sie dies tun
quelle
Die
Instant
Klasse enthält keine Zoneninformationen, sondern speichert den Zeitstempel nur in Millisekunden ab der UNIX-Epoche, dh ab dem 1. Januar 1070 ab UTC. Daher kann der Formatierer kein Datum drucken, da das Datum immer für eine konkrete Zeitzone gedruckt wird. Sie sollten die Zeitzone auf Formatierung einstellen und alles wird in Ordnung sein, wie folgt:quelle
Wenn Sie weiterhin einen aus einem Muster erstellten Formatierer verwenden möchten, können Sie einfach LocalDateTime anstelle von Instant verwenden:
quelle
Instants befinden sich bereits in UTC und haben bereits das Standard-Datumsformat JJJJ-MM-TT . Wenn Sie damit zufrieden sind und sich nicht mit Zeitzonen oder Formatierungen herumschlagen möchten, können Sie auch Folgendes tun
toString()
:Willst du nicht das T und Z? (Z gibt an, dass dieses Datum UTC ist. Z steht für "Zulu" oder "Zero Hour Offset" oder UTC)):
Willst du Millisekunden statt Nanosekunden? (Sie können es also in eine SQL-Abfrage einfügen):
etc.
quelle
Ich glaube, dies könnte helfen. Möglicherweise müssen Sie eine Art localdate-Variation anstelle von Instant verwenden
quelle