Ich habe eine Epochensekunde und eine zoneId nach Methode1. Es kann mit der Systemstandardzone zoneId in LocalDateTime konvertiert werden, aber ich finde keine Möglichkeit, die Epochensekunde nach Methode2 in LocalDateTime zu konvertieren, da es keine gibt. ZoneOffset.systemDefault
Ich denke, es ist dunkel.
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
val epochSecond = System.currentTimeMillis() / 1000
LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
funktioniert? Es ist einunexpected token
für mich in Java 11.java.time
hier ausführlichAntworten:
Hier ist , wie Sie bekommen können
ZoneOffset
ausZoneId
:Instant instant = Instant.now(); //can be LocalDateTime ZoneId systemZone = ZoneId.systemDefault(); // my timezone ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);
Hinweis:
ZoneId
Je nach Zeitpunkt und Verlauf des jeweiligen Ortes kann der Versatz unterschiedlich sein. Die Auswahl verschiedener Instanzen würde also zu unterschiedlichen Offsets führen.NB2:
ZoneId.of()
kann ein zurückgeben,ZoneOffset
anstattZoneId
wennUTC+3
/GMT+2
/ etc im Gegensatz zu einer Zeitzone wie übergeben wirdAfrica/Cairo
. Wenn also UTC / GMT-Offsets übergeben werden, werden historische / geografische / Sommerzeitinformationen desInstant
nicht berücksichtigt - Sie arbeiten einfach mit dem angegebenen Offset.quelle
ZoneId.systemDefault()
Ihren Code und er gibt auf verschiedenen Computern unterschiedliche Zeitzonen zurück?Es gibt keine Eins-zu-Eins-Zuordnung. Eine ZoneId definiert eine geografische Ausdehnung, in der im Laufe der Zeit eine Reihe verschiedener ZoneOffsets verwendet wird. Wenn die Zeitzone Sommerzeit verwendet, unterscheidet sich das ZoneOffset zwischen Sommer und Winter.
Darüber hinaus haben sich die Sommerzeitregeln möglicherweise im Laufe der Zeit geändert, sodass sich das ZoneOffset beispielsweise für den 13.10.2015 vom 13.10.1980 unterscheiden kann.
Sie können das ZoneOffset für eine ZoneId also nur für einen bestimmten Instant finden.
Siehe auch https://en.wikipedia.org/wiki/Tz_database
quelle
tl; dr
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
… Der aktuellen Standardzeitzone…
Einzelheiten
Die Antwort von Stanislav Bshkyrtsev beantwortet Ihre Frage richtig und direkt.
Es gibt jedoch größere Probleme, wie in der Antwort von Jon Skeet vorgeschlagen .
LocalDateTime
LocalDateTime
hat absichtlich kein Konzept der Zeitzone oder des Versatzes von UTC. Nicht wahrscheinlich, was Sie wollen. DasLocal…
bedeutet jeden Ort, keinen bestimmten Ort. Diese Klasse repräsentiert keinen Moment, sondern nur potenzielle Momente in einem Bereich von etwa 26 bis 27 Stunden (dem Bereich der Zeitzonen rund um den Globus).Instant
Sie müssen nicht mit Sekunden beginnen, wenn Sie versuchen, die aktuelle Zeit abzurufen. Holen Sie sich den aktuellen
Instant
. DieInstant
Klasse repräsentiert einen Moment auf der Zeitachse in UTC mit einer Auflösung von Nanosekunden (bis zu neun (9) Stellen eines Dezimalbruchs).Darin
Instant
befindet sich eine Anzahl von Nanosekunden aus der Epoche. Aber das interessiert uns nicht wirklich.ZonedDateTime
Wenn Sie diesen Moment durch die Linse der Wanduhrzeit einer bestimmten Region sehen möchten, wenden Sie a
ZoneId
an , um a zu erhaltenZonedDateTime
.ZoneId z = ZoneId.of( "Europe/Paris" ); ZonedDateTime zdt = instant.atZone( z );
Als Abkürzung können Sie direkt auf die
ZonedDateTime
.A
ZonedDateTime
hat einInstant
in sich. Rufen Siezdt.toInstant()
an, um den gleichen Zeitpunkt wie einen Grundwert in UTC zu erhalten . Gleiche Anzahl von Nanosekunden seit der Epoche, entweder alsZonedDateTime
oder alsInstant
.Sekunden seit der Epoche gegeben
Wenn Sie eine Anzahl von Sekunden seit der Epoche erhalten und die Epoche der erste Moment von 1970 in UTC (
1970-01-01T00:00:00Z
) ist, geben Sie diese Zahl an einInstant
.long secondsSinceEpoch = 1_484_063_246L ; Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;
Ü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
.Weitere Informationen finden Sie im Oracle-Lernprogramm . Suchen Sie im Stapelüberlauf nach vielen Beispielen und Erklärungen. Die Spezifikation ist JSR 310 .
Das Joda-Time- Projekt, das sich jetzt im Wartungsmodus befindet , empfiehlt die Migration zu den Klassen 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 Strings, 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
In der Dokumentation heißt es: "Dies ist in erster Linie für Konvertierungen auf niedriger Ebene und nicht für die allgemeine Verwendung von Anwendungen gedacht."
Das Durchgehen
Instant
macht für mich vollkommen Sinn - Ihre Epochensekunde ist effektiv eine andere Darstellung von a.Instant
Konvertieren Sie also in eineInstant
und konvertieren Sie diese dann in eine bestimmte Zeitzone.quelle
Ich hoffe, die ersten beiden Zeilen meiner Lösung unten sind hilfreich. Mein Problem war, dass ich eine
LocalDateTime
und den Namen einer Zeitzone hatte, und ich brauchte eine,instant
damit ich eine erstellen konntejava.util.Date
, denn genau das wollte MongoDB. Mein Code ist Scala, aber hier ist er so nah an Java, dass ich denke, es sollte kein Problem geben, ihn zu verstehen:val zid = ZoneId.of(tzName) // "America/Los_Angeles" val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00 // 2017-03-16T18:03 val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00 val instant = odt.toInstant // ⇒ 2017-03-17T01:03:00Z val issued = Date.from(instant)
quelle
Im Folgenden wird die Zeit in Millisekunden zurückgegeben, die zur UTC hinzugefügt werden muss, um die Standardzeit in dieser Zeitzone zu erhalten:
TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()
quelle
ZonedDateTime
aus der zweiten Epoche und Zone IdZoneOffset
vonZonedDateTime
Demo:
import java.time.Instant; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; public class Main { public static void main(String[] args) { // Get ZonedDateTime from epoch second and Zone Id ZonedDateTime zdt = Instant.ofEpochSecond(1597615462L).atZone(ZoneId.of("Europe/London")); // Get ZoneOffset from ZonedDateTime ZoneOffset offset = zdt.getOffset(); System.out.println(offset); } }
Ausgabe:
+01:00
quelle