Joda-Time: qual è la differenza tra periodo, intervallo e durata?


192

In Joda-Time 2, qual è la differenza tra i tre tipi di intervalli di tempo:

  • Periodo
  • Intervallo
  • Durata

    1. Perché abbiamo bisogno di tre classi?

    2. Quale si comporta meglio?

    3. Perché la divisione di un'istanza Periodo o Durata o Intervallo non è implementata? Per esempiop = p.divideBy(2);


3
Questa terminologia data-ora non è stata (ancora) standardizzata. L' idea della norma ISO-8601 di una durata è ciò che Joda-Time considera a Period. Una proposta per standardizzare tale terminologia è stata sollevata ma non ancora realizzata.
Basil Bourque,

Risposte:


246

Sono necessarie 3 classi perché rappresentano concetti diversi, quindi si tratta di scegliere quella appropriata per il lavoro anziché le prestazioni relative. Dalla documentazione con commenti aggiunti da me in corsivo :


Un intervallo in Joda-Time rappresenta un intervallo di tempo da un millisecondo a un altro istante. Entrambi gli istanti sono istanti completamente specificati nel continuum datetime, completi di fuso orario. Si definiscono orari specifici, ad esempio questo potrebbe essere l'intervallo tra le 20:00 di 00:00 di ieri e le 09:00 di 00:00 di questa mattina.

Una durata in Joda-Time rappresenta una durata misurata in millisecondi. La durata è spesso ottenuta da un intervallo. cioè possiamo sottrarre l'inizio dalla fine di un intervallo per ricavare una durata

Un periodo in Joda-Time rappresenta un periodo di tempo definito in termini di campi, ad esempio 3 anni 5 mesi 2 giorni e 7 ore. Ciò differisce da una durata in quanto è inesatto in termini di millisecondi. Un periodo può essere risolto in un numero esatto di millisecondi specificando l'istante (compresi cronologia e fuso orario) a cui è relativo. ad es. considerare il periodo di 1 anno, se lo aggiungiamo al 1 ° gennaio arriveremo sempre al 1 ° gennaio successivo, ma la durata dipenderà dal fatto che l'anno intermedio sia un anno bisestile o meno. Allo stesso modo se aggiungiamo 1 mese al 1 ° di un mese, arriveremo al 1 ° del mese successivo ma la durata (in millisecondi) varierà in base al mese in questione


Per la domanda 3, Un metodo specifico per dividere una durata non è realmente necessario perché possiamo sempre ottenere il numero di millisecondi dalla durata come long(usando getMillis()), dividerlo e costruire una nuova durata (usando new Duration(long duration)).

La divisione di un periodo non ha davvero un significato reale basato sulla definizione di un periodo precedente. ad es. che è mezzo mese? (la sua durata dipenderà da quale mese).


1
Penso che dividere un periodo abbia un significato: mezzo mese è ancora un'unità di tempo valida, ma richiede una data di inizio per sapere esattamente quanto tempo (esattamente allo stesso modo in cui un mese è un periodo valido).
Hadley,

11
Jodatime considera un periodo una tupla di campi valutati INTEGER, non consente valori frazionari. Ciò è coerente con l'uso comune (civile). Praticamente nessuno nella vita comune ritiene che "1 mese e 10 giorni" divisi per due sia "mezzo mese e 5 giorni". Se hai bisogno di fare quella divisione, probabilmente vuoi andare a una durata (tempo fisico).
leonbloy,

90

Per aggiungere alla risposta di Mike :

Una durata Joda-Time è un intervallo di tempo "fisico"; per esempio:

12000 milliseconds <- questa è una durata

Un intervallo Joda-Time è in realtà una coppia di istanti (inizio istantaneo - fine istantaneo). Un istante è, ancora una volta, un concetto "fisico", un punto nella sequenza temporale. Ad esempio (solo una possibile notazione):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- questo è un intervallo

Un intervallo , quindi, può essere convertito in una durata , ma non il contrario.

Considera questi due intervalli:

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)

Come intervalli I1e I2sono diversi, perché i punti finali sono diversi; ma se li converto a durate, ottengo la stessa cosa: 3600000 milliseconds.

(Analogia matematica: gli intervalli [10,12]e [95,97]sono intervalli diversi , ma hanno la stessa lunghezza : la "lunghezza intervallo" è mappata alla durata ).

Infine, un periodo è un intervallo di "tempo civile", espresso in un numero di mesi, giorni, ore, ecc. Non rappresenta di per sé un intervallo "fisico", quindi non può essere convertito direttamente in un durata (i mesi hanno lunghezze variabili ...).

Questo risponde alla domanda 3: puoi dividere solo per due un tempo fisico (una durata).


Quattro mesi divisi per due sarebbero due mesi. Perché non è valido?
Hadley,

1
Come calcoli '2 mesi; 18 giorni divisi per 3? Non è possibile ottenere una definizione coerente per quel tipo di operazione.
leonbloy,

3
Penso che puoi ottenere una definizione coerente, ma devi pensarci come 1/3 del tempo di "2 mesi e 18 giorni". Non sarai in grado di capire esattamente di cosa si tratta fino a quando non lo converti in un intervallo. Solo perché JODA non supporta non significa che non sia valido.
Hadley,

@hadley Non esiste una definizione civile per "un terzo del giorno". Ad esempio, nessun contratto è valido per un terzo di un giorno.
ipavlic,

4
@Richard Watson Days può durare 23, 24 o 25 ore, a causa dell'ora legale. Pertanto "un terzo del giorno a partire da ..." è valido, ma solo "un terzo" non lo è.
ipavlic,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.