Joda-Zeit: Was ist der Unterschied zwischen Periode, Intervall und Dauer?


192

Was ist in Joda-Time 2 der Unterschied zwischen den drei Arten von Zeitspannen:

  • Zeitraum
  • Intervall
  • Dauer

    1. Warum brauchen wir drei Klassen?

    2. Welches ist besser?

    3. Warum ist das Teilen einer Perioden-, Dauer- oder Intervallinstanz nicht implementiert? Z.Bp = p.divideBy(2);


3
Beachten Sie, dass diese Terminologie für Datum und Uhrzeit (noch) nicht standardisiert wurde. Die Idee des ISO-8601- Standards von einer Dauer ist das, was Joda-Time als a betrachtet Period. Ein Vorschlag zur Standardisierung einer solchen Terminologie wurde vorgelegt, aber noch nicht umgesetzt.
Basil Bourque

Antworten:


246

Es werden 3 Klassen benötigt, da sie unterschiedliche Konzepte darstellen. Es geht also eher darum, die für den Job geeignete auszuwählen, als um die relative Leistung. Aus der Dokumentation mit von mir kursiv hinzugefügten Kommentaren :


Ein Intervall in Joda-Zeit repräsentiert ein Zeitintervall von einem Millisekunden-Moment zu einem anderen Moment. Beide Zeitpunkte sind vollständig spezifizierte Zeitpunkte im Datums- / Uhrzeitkontinuum mit Zeitzone. Es werden bestimmte Zeiten definiert, z. B. kann dies das Intervall zwischen 20: 00: 00GMT gestern und 09: 00: 00GMT heute Morgen sein.

Eine Dauer in Joda-Zeit repräsentiert eine in Millisekunden gemessene Zeitdauer. Die Dauer wird oft aus einem Intervall erhalten. dh wir können den Anfang vom Ende eines Intervalls subtrahieren, um eine Dauer abzuleiten

Ein Zeitraum in Joda-Time stellt einen Zeitraum dar, der in Form von Feldern definiert ist, z. B. 3 Jahre 5 Monate 2 Tage und 7 Stunden. Dies unterscheidet sich von einer Dauer dadurch, dass sie in Millisekunden ungenau ist. Ein Zeitraum kann nur auf eine genaue Anzahl von Millisekunden aufgelöst werden, indem der Zeitpunkt (einschließlich Chronologie und Zeitzone) angegeben wird, auf den er sich bezieht. Betrachten Sie beispielsweise den Zeitraum von 1 Jahr. Wenn wir diesen zum 1. Januar hinzufügen, werden wir immer am nächsten 1. Januar ankommen, aber die Dauer hängt davon ab, ob das dazwischenliegende Jahr ein Schaltjahr ist oder nicht. Wenn wir dem 1. eines Monats 1 Monat hinzufügen, erreichen wir den 1. des nächsten Monats, aber die Dauer (in Millisekunden) hängt vom jeweiligen Monat ab


Für Frage 3 ist eine bestimmte Methode zum Teilen einer Dauer nicht wirklich erforderlich, da wir immer die Anzahl der Millisekunden aus der Dauer als long(Verwenden getMillis()) abrufen, sie teilen und eine neue Dauer (Verwenden new Duration(long duration)) erstellen können .

Das Teilen einer Periode hat keine wirkliche Bedeutung, basierend auf der Definition einer Periode oben. zB was ist ein halber Monat? (seine Länge würde von welchem ​​Monat abhängen).


1
Ich denke, das Teilen eines Zeitraums hat eine Bedeutung - ein halber Monat ist immer noch eine gültige Zeiteinheit, aber es erfordert ein Startdatum, um genau zu wissen, wie lange (genau so, wie ein Monat ein gültiger Zeitraum ist).
Hadley

11
Jodatime betrachtet einen Punkt als ein Tupel von INTEGER-bewerteten Feldern, es erlaubt keine Bruchwerte. Das steht im Einklang mit der allgemeinen (zivilen) Verwendung. Praktisch niemand im gemeinsamen Leben ist der Meinung, dass "1 Monat und 10 Tage" geteilt durch zwei "ein halber Monat und 5 Tage" sind. Wenn Sie diese Unterteilung durchführen müssen, möchten Sie wahrscheinlich zu einer Dauer (physische Zeit) gehen.
Leonbloy

90

Um Mikejs Antwort hinzuzufügen :

Eine Joda- Zeitdauer ist ein "physisches" Zeitintervall; z.B:

12000 milliseconds <- Dies ist eine Dauer

Ein Joda- Zeitintervall besteht eigentlich aus zwei Zeitpunkten (Startzeitpunkt - Endzeitpunkt). Ein Augenblick ist wiederum ein "physisches" Konzept, ein Punkt in der Zeitleiste. ZB (nur eine mögliche Notation):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- Dies ist ein Intervall

Ein Intervall kann also in eine Dauer umgewandelt werden , nicht jedoch umgekehrt.

Betrachten Sie diese beiden Intervalle:

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

Als Intervalle I1und I2sind unterschiedlich, weil die Endpunkte unterschiedlich sind; aber wenn ich sie in Dauern umwandle, bekomme ich das gleiche : 3600000 milliseconds.

(Mathematische Analogie: Die Intervalle [10,12]und [95,97]sind unterschiedliche Intervalle , aber sie haben die gleiche Länge : "Intervalllänge" entspricht der Dauer ).

Schließlich ist ein Zeitraum ein Zeitraffer der "Zivilzeit", ausgedrückt als Anzahl von Monaten, Tagen, Stunden usw. Er stellt für sich genommen kein "physisches" Intervall dar und kann daher nicht direkt in a umgewandelt werden Dauer (Monate haben unterschiedliche Längen ...).

Dies beantwortet Frage 3: Sie können eine physikalische Zeit (eine Dauer) nur durch zwei teilen.


Vier Monate geteilt durch zwei wären zwei Monate. Warum ist das nicht gültig?
Hadley

1
Wie würden Sie 2 Monate berechnen? 18 Tage geteilt durch 3? Sie können keine konsistente Definition für diese Art von Operation erhalten.
Leonbloy

3
Ich denke, Sie können eine konsistente Definition erhalten, aber Sie müssen sie als 1/3 der Zeit von "2 Monaten und 18 Tagen" betrachten. Sie können erst dann genau herausfinden, was es ist, wenn Sie es in ein Intervall konvertieren. Nur weil JODA dies nicht unterstützt, heißt das nicht, dass es ungültig ist.
Hadley

@ Hadley Es gibt keine zivile Definition für "ein Drittel eines Tages". ZB ist ein Vertrag für ein Drittel eines Tages nicht gültig.
Ipavlic

4
@ Richard Watson Days können aufgrund der Sommerzeit 23, 24 oder 25 Stunden lang sein. Daher ist "ein Drittel eines Tages ab ..." gültig, aber nur "ein Drittel" nicht.
ipavlic
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.