Czas Joda: jaka jest różnica między okresem, interwałem i czasem trwania?

192

W Joda-Time 2 jaka jest różnica między tymi trzema rodzajami przedziałów czasowych:

  • Kropka
  • Interwał
  • Trwanie

    1. Dlaczego potrzebujemy trzech klas?

    2. Który działa lepiej?

    3. Dlaczego podział instancji Okresu lub Czas trwania lub Interwał nie jest zaimplementowany? Na przykładp = p.divideBy(2);

Gerard
źródło
3
Zauważ, że ta terminologia data-czas nie została jeszcze ustandaryzowana. W ISO-8601 standardu idea trwania wynosi co Joda-Time uznaje, że Period. Propozycja ujednolicenia takiej terminologii została podniesiona, ale nie została jeszcze zrealizowana.
Basil Bourque,

Odpowiedzi:

246

Potrzebne są 3 klasy, ponieważ reprezentują one różne koncepcje, więc kwestią jest wybranie odpowiedniej dla zadania, a nie względnej wydajności. Z dokumentacji z komentarzami dodanymi przeze mnie kursywą :


Przerwa w Joda-Time reprezentuje przedział czasu od jednej milisekundy chwilę do innej chwili. Oba instancje są w pełni określonymi instancjami w kontinuum datetime, wraz ze strefą czasową. Określono określone godziny, np. Może to być przedział między 20: 00: 00GMT wczoraj a 09: 00: 00GMT dziś rano.

Czas w Joda-Time reprezentuje okres czasu, mierzony w milisekundach. Czas trwania jest często uzyskiwany z przedziału. tzn. możemy odjąć początek od końca przedziału, aby uzyskać czas trwania

Okres w Joda-Time reprezentuje okres czasu zdefiniowany w zakresie dziedzin, na przykład, 3 lata i 5 miesięcy 2 dni i 7 godzin. Różni się on od czasu trwania tym, że jest niedokładny pod względem milisekund. Kropkę można rozwiązać tylko do dokładnej liczby milisekund, określając moment (w tym chronologię i strefę czasową), do której się odnosi. np. rozważmy okres 1 roku, jeśli dodamy to do 1 stycznia, zawsze dotrzemy do następnego 1 stycznia, ale czas trwania będzie zależeć od tego, czy rok pośredni jest rokiem przestępnym, czy nie. Podobnie, jeśli dodamy 1 miesiąc do 1. miesiąca, dotrzemy do 1. dnia następnego miesiąca, ale czas trwania (w milisekundach) będzie się różnić w zależności od danego miesiąca


W przypadku pytania 3 konkretna metoda podziału czasu trwania nie jest tak naprawdę potrzebna, ponieważ zawsze możemy uzyskać liczbę milisekund z czasu trwania jako long(za pomocą getMillis()), podzielić go i skonstruować nowy czas trwania (za pomocą new Duration(long duration)).

Dzielenie kropki tak naprawdę nie ma rzeczywistego znaczenia na podstawie powyższej definicji okresu. np. co to jest pół miesiąca? (jego długość zależy od miesiąca).

mikej
źródło
1
Myślę, że dzielenie okresu ma znaczenie - pół miesiąca wciąż jest prawidłową jednostką czasu, ale wymaga daty początkowej, aby wiedzieć dokładnie, jak długo (dokładnie w ten sam sposób miesiąc jest prawidłowym okresem).
hadley
11
Jodatime uważa kropkę za krotkę pól o wartości INTEGER, nie pozwala na wartości ułamkowe. Jest to zgodne z powszechnym (cywilnym) użyciem. Praktycznie nikt w życiu codziennym nie uważa, że ​​„1 miesiąc i 10 dni” podzielone przez dwa to „pół miesiąca i 5 dni”. Jeśli musisz dokonać tego podziału, prawdopodobnie chcesz przejść na czas trwania (czas fizyczny).
leonbloy
90

Aby dodać do odpowiedzi mikej :

Joda-Time czas jest „fizyczne” przedział czasu; na przykład:

12000 milliseconds <- jest to czas trwania

Przedział czasu Joda to w rzeczywistości para chwil (początek natychmiastowy - koniec natychmiastowy). Natychmiastowy jest, znowu, „fizyczne” koncepcji, punkt na osi czasu. Np. (Tylko możliwy zapis):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- to jest interwał

Odstęp , a następnie, można przeprowadzić w czasie , ale nie na odwrót.

Rozważ te dwa przedziały:

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)

Jako przedziały I1i I2są różne, ponieważ punkty końcowe są różne; ale jeśli przekonwertować je do trwania, mam to samo: 3600000 milliseconds.

(Analogia matematyczna: interwały [10,12]i [95,97]są różnymi interwałami , ale mają tę samą długość : „długość interwału” odwzorowuje na czas trwania ).

Wreszcie okres jest upływem „czasu cywilnego”, wyrażonego jako liczba miesięcy, dni, godzin itp. Nie reprezentuje on - sam w sobie - interwału „fizycznego”, dlatego nie można go bezpośrednio przekształcić w czas trwania (miesiące mają różne długości ...).

Odpowiada to pytanie 3: czas fizyczny (czas trwania) można podzielić tylko na dwa.

leonbloy
źródło
Cztery miesiące podzielone przez dwa to dwa miesiące. Dlaczego to nie jest ważne?
hadley,
1
Jak obliczysz „2 miesiące”; 18 dni podzielone przez 3? Nie można uzyskać spójnej definicji tego rodzaju operacji.
leonbloy
3
Myślę, że możesz uzyskać spójną definicję, ale musisz myśleć o niej jako o 1/3 czasu „2 miesiące i 18 dni”. Nie będziesz w stanie dokładnie ustalić, co to jest, dopóki nie przekształcisz go w interwał. To, że JODA nie obsługuje, nie oznacza, że ​​jest nieprawidłowe.
hadley,
@hadley Nie ma cywilnej definicji „jednej trzeciej dnia”. Np. Żadna umowa nie jest ważna przez jedną trzecią dnia.
ipavlic
4
@Richard Watson Days może mieć 23, 24 lub 25 godzin z powodu czasu letniego. Dlatego „jedna trzecia dnia od…” jest ważna, ale tylko „jedna trzecia” nie.
ipavlic