2015-09-07 16 views
70

Ich weiß, dass:Java 8: Was ist der Unterschied zwischen Instant und LocalDateTime?

  • Sofort ist eher eine "technische" Zeitstempel-Darstellung (ns) für die Berechnung.
  • LocalDateTime ist eher Datum/Uhrzeit-Darstellung einschließlich Zeitzonen für Menschen.

Immer noch am Ende IMO beide können als Typ für die meisten Anwendungsfälle verwendet werden. Als Beispiel: Momentan führe ich einen Batch-Job, bei dem ich einen nächsten Lauf basierend auf Daten berechnen muss und ich kämpfe, um ein Pro/Contra zwischen diesen beiden Typen zu finden (abgesehen vom Nanosekunden-Präzisionsvorteil von Instant und dem Zeitzonenteil) von LocalDateTime).

Können Sie einige Anwendungsbeispiele nennen, in denen nur Instant oder LocalDateTime verwendet werden sollte?

Edit: Vorsicht misread Dokumentationen für Local in Bezug auf Präzision und Zeitzone

+0

Instant ist elementarer, wickelt den Standard lange für die UTC. Für eine Cron-ähnliche Charge nicht so logisch eine Wahl. –

+6

** Falsche ** Definition. 'LocalDateTime' hat * keine * Zeitzone! –

Antwort

164

Falsche Presumption

Local ist eher Datum/Uhr Darstellung einschließlich Zeitzonen für die Menschen.

Ihre Aussage ist falsch: A LocalDateTimekeine Zeitzone hat. Keine Zeitzone zu haben, ist der ganze Punkt dieser Klasse.

diese Klasse doc zitieren:

Diese Klasse speichert keine oder eine Zeitzone darstellen. Stattdessen ist es eine Beschreibung des Datums, wie es für Geburtstage verwendet wird, kombiniert mit der lokalen Zeit, die an einer Wanduhr zu sehen ist. Es kann keinen Augenblick auf der Zeitlinie ohne zusätzliche Informationen wie einen Offset oder eine Zeitzone darstellen.

Also Local… bedeutet "nicht in Zonen eingeteilt".

Sofort

Ein Instant ist ein Moment auf der Timeline in UTC, eine Zählung von nanoseconds seit der Epoche des ersten Moments des Jahres 1970 UTC (im Grunde Klasse doc für winzigsten Details). Da die meisten Ihrer Geschäftslogik, Datenspeicherung und Datenaustausch in UTC erfolgen sollten, ist dies eine praktische Klasse, die häufig verwendet wird.

Instant instant = Instant.now() ; // Capture the current moment in UTC. 

ZoneID

ZoneId A ist ein time zone.

Eine Zeitzone ist ein Offset von so vielen Stunden und Minuten von UTC entfernt. Ein neuer Tag beginnt zum Beispiel früher in Paris als in Montréal. Wir müssen also die Zeiger der Uhr verschieben, um besser zu reflektieren, noon (wenn die Sonne direkt über der Sonne ist) für eine bestimmte Region. Je weiter östlich/westlich von der UTC-Linie in Westeuropa/Afrika entfernt, desto größer ist der Versatz.

Eine Zeitzone ist eine Reihe von Regeln für den Umgang mit Anpassungen und Anomalien, wie sie von einer lokalen Gemeinschaft oder Region praktiziert werden. Die häufigste Anomalie ist der allseits beliebte Irrsinn Daylight Saving Time (DST).

Eine Zeitzone hat die Historie vergangener Regeln, aktueller Regeln und Regeln für die nahe Zukunft bestätigt.

Diese Regeln ändern sich häufiger als erwartet. Achten Sie darauf, die Regeln Ihrer Date-Time-Bibliothek, normalerweise eine Kopie von the 'tz' database, auf dem neuesten Stand zu halten. In Java 8 ist es einfacher denn je, auf dem neuesten Stand zu bleiben, indem Oracle eine Timezone Updater Tool veröffentlicht.

Verwenden Sie proper time zone names. Diese Namen haben die Form Kontinent plus SLASH plus Stadt oder Region.Vermeiden Sie die 3-4 Buchstabencodes wie EST oder IST. Sie sind weder standardisiert noch einzigartig. Sie verwirren weiter die Unordnung von DST.

Zeitzone = Offset + Regeln Anpassungen

ZoneId z = ZoneId.of(“Africa/Tunis”) ; 

Manchmal haben wir nur eine ohne die Regeln gegenüber. Java stellt dazu die ZoneOffset eine Unterklasse von ZoneId zur Verfügung. Beachten Sie die dort definierte handliche Konstante ZoneOffset.UTC.

ZoneOffset offset = ZoneOffset.of(-5 , 0) ; // “-05:00” 

ZonedDateTime

Die ZonedDateTime Klasse ist ein Instant mit zugeordnetem ZoneID.

ZonedDateTime = Sofort + ZoneID

Fast alle Backend, Datenbanken, Business-Logik, Datenpersistenz, Datenaustausch alle in UTC sein sollte. Für die Präsentation für Benutzer müssen Sie sich jedoch auf eine vom Benutzer erwartete Zeitzone einstellen. Dies ist der Zweck der Klasse ZonedDateTime und der formatter classes, die zum Generieren von String-Darstellungen dieser Datums- und Uhrzeitwerte verwendet wird.

ZonedDateTime zdt = instant.atZone(z) ; 

Local, LOCALDATE, Localtime

Die "local" Datum Zeitklassen, LocalDateTime, LocalDate, LocalTime, sind eine andere Art von Lebewesen. Sie sind nicht an eine bestimmte Lokalität oder Zeitzone gebunden. Sie sind nicht an die Zeitlinie gebunden. Sie haben keine wirkliche Bedeutung, bis Sie sie an einen Ort gelten auf der Timeline einen Punkt zu finden.

Zum Beispiel: „Weihnachten am 25. Dezember 2015 um Mitternacht beginnt“ ist ein Local. Mitternacht schlägt in verschiedenen Momenten in Paris als in Montréal, und anders wieder in Seattle und in Auckland.

LocalDate ld = LocalDate.of(2018 , Month.DECEMBER , 25) ; 
LocalTime lt = LocalTime.MIN ; // 00:00:00 
LocalTime ldt = LocalDateTime.of(ld , lt) ; // Xmas morning anywhere. 

Ein weiteres Beispiel, „hat Acme Unternehmen eine Politik, die beginnt um 12.30 Uhr an jedem seiner Fabriken weltweit Mittagszeit“ ein LocalTime ist. Um wirkliche Bedeutung zu haben, müssen Sie es in die Timeline anzuwenden, um den Moment der 00.30 am Stuttgart Fabrik oder 00.30 am Rabat Fabrik oder 00.30 am Sydney Fabrik Figur.

Also für Business-Anwendungen, die „Local“ Typen sind nicht häufig, da sie nur die allgemeine Idee einer möglichen Datum oder die Uhrzeit nicht einem bestimmten Zeitpunkt auf der Zeitleiste darstellen verwendet. Business-Apps neigen dazu, sich um den genauen Zeitpunkt zu kümmern, an dem eine Rechnung eingeht, ein Produkt für den Transport geliefert wird, ein Mitarbeiter eingestellt wurde oder das Taxi die Garage verlässt. So verwenden Business-App-Entwickler fast ausschließlich Instant und ZonedDateTime. Auf der anderen Seite sollten Sie für die Buchung zukünftige Ereignisse mit den Local… Typen berücksichtigen (ex: Zahnarzttermine) weit genug in der Zukunft, wo man Politiker Verfeinerung die Zeitzone mit wenig forewarning riskieren, da sie so oft tun.

+13

Große Antwort. Ich denke, einige Verwirrung (zumindest meine) kommt von der "lokalen" Benennung. Meine Intuition für 'Local' bedeutet in Bezug auf wo ich AND bin und wann ich (?!) Bin, was mich zu der Annahme bringt, dass es tatsächlich eine" ZonedDateTime "wäre. – mkobit

+3

Ja, es ist verwirrend. Aus diesem Grund hat java.time geschickt das Wort 'Zoned' zum Klassennamen 'DateTime' hinzugefügt, der von seinem Vorgänger Joda-Time verwendet wurde (erzeugt 'ZonedDateTime'), um den Unterschied zu den" Local "-Klassen zu betonen. Stellen Sie sich den Namen "Local" als Abkürzung für "auf eine bestimmte Lokalität anwenden" vor. –

+1

Präfixierung mit dem Wort 'Local' könnte auch eine Möglichkeit gewesen sein, sich vom java.util-Paket zu unterscheiden, obwohl ich irgendwie denke, dass es eine bessere Wortwahl hätte geben können. – bphilipnyc

10

Ein Hauptunterschied ist der Local Teil LocalDateTime. Wenn Sie in Deutschland leben und eine Instanz erstellen und jemand anders in den USA lebt und im selben Moment eine weitere Instanz erstellt (sofern die Uhren richtig eingestellt sind) - wäre der Wert dieser Objekte tatsächlich unterschiedlich. Dies gilt nicht für Instant, die unabhängig von der Zeitzone berechnet wird.

LocalDateTime speichert Datum und Uhrzeit ohne Zeitzone, aber der Anfangswert hängt von der Zeitzone ab. Instant ist nicht.

Darüber hinaus bietet LocalDateTime Methoden zum Bearbeiten von Datum Komponenten wie Tage, Stunden, Monate. Ein Instant nicht.

abgesehen von der Nanosekunde Präzision Vorteile von Instant-und Zeitzone Teil von Local

Beiden Klassen haben die gleiche Präzision. LocalDateTime speichert keine Zeitzone. Lesen Sie javadocs gründlich, da Sie mit solchen ungültigen Annahmen einen großen Fehler machen können: Instant und LocalDateTime.

+0

Entschuldigung für falsch gelesen Teil auf Zone + Präzision. Entschuldigung für die Wiederholung von oben: In Anbetracht einer einzelnen Zeitzonenanwendung, in welchen Anwendungsfällen würden Sie LocalDateTime bevorzugen oder umgekehrt? –

+1

Ich würde LocalDateTime immer dann verwenden, wenn ich Daten und/oder Zeiten benötige. In Stunden, Minuten oder so. Ich würde Instant zum Beispiel verwenden, um die Ausführungszeiten zu messen oder ein internes Feld von etw zu speichern. Berechnen Sie die nächsten Läufe, wie in Ihrem Fall? LocalDateTime scheint angemessen, aber es ist eine Meinung. Wie Sie gesagt haben, können beide verwendet werden. – Dariusz

9

Sie liegen falsch in Bezug auf LocalDateTime: Es speichert keine Zeitzoneninformationen und es hat Nanosekundengenauigkeit. Unter Angabe der Javadoc- (emphasis sich):

Eine Datum-Zeit ohne eine Zeitzone in dem ISO-8601 Kalendersystem wie 2007-12-03T10: 15: 30.

LocalDateTime ist ein unveränderliches Datum-Uhrzeit-Objekt, das eine Datum-Uhrzeit darstellt, die oft als Jahr-Monat-Tag-Stunde-Minute-Sekunde angezeigt wird. Andere Datums- und Uhrzeitfelder, wie zum Beispiel Tag des Tages, Wochentag und Woche des Jahres, können ebenfalls aufgerufen werden. Die Zeit wird in Nanosekunden-Genauigkeit dargestellt. Zum Beispiel kann der Wert "2. Oktober 2007 um 13: 45.30.123456789" in einer LocalDateTime gespeichert werden.

Der Unterschied zwischen den beiden ist, dass ein von der Instant Epoch Offset repräsentiert (01-01-1970), und als solches stellt einen bestimmten Zeitpunkt auf der Zeitlinie. Zwei Instant Objekte, die im selben Moment an zwei verschiedenen Orten der Erde erschaffen wurden, haben genau denselben Wert.

+0

Unter Berücksichtigung einer einzelnen Zeitzonenanwendung, in welchen Anwendungsfällen würden Sie LocalDateTime bevorzugen oder umgekehrt? –

+3

@manuelladana Es ist mehr eine Frage des Geschmacks. Ich bevorzuge LocalDateTime für alles, was mit dem Benutzer zu tun hat (Geburtstag ...) und Instant für alles, was mit der Maschine zu tun hat (Ausführungszeit ...). – Tunaki

+1

@manuelladana Eine einzelne Zeitzonen-App ist selten, wenn nicht gar nicht vorhanden. Es könnte passieren, dass Sie die Zeitzonen für eine kleine App ignorieren, die Sie für Ihren lokalen Baroque Music Club aufgepeppt haben. Sobald Sie jedoch ein Ereignis an Personen senden müssen, die reisen (und Zeitzonen durchqueren), möchten sie, dass diese Daten an eine Zeitzone gebunden sind, damit sich ihre Kalenderanwendung bei Bedarf anpassen lässt. Ich schlage vor, dass Sie in all Ihren Apps lernen, mit Zeitzonen richtig zu arbeiten. –

0

Instant entspricht der Zeit auf dem Hauptmeridian (Greenwich).

Während LocalDateTime in Bezug auf OS Zeitzoneneinstellungen und

kann nicht einen Augenblick ohne zusätzliche Informationen wie eine Offset-oder Zeitzone darstellen.

Verwandte Themen