Joda-Time: ¿cuál es la diferencia entre período, intervalo y duración?

192

En Joda-Time 2, ¿cuál es la diferencia entre los tres tipos de períodos de tiempo:

  • Período
  • Intervalo
  • Duración

    1. ¿Por qué necesitamos tres clases?

    2. ¿Cuál se desempeña mejor?

    3. ¿Por qué no se implementa dividir una instancia de Período o Duración o Intervalo? P.ejp = p.divideBy(2);

Gerard
fuente
3
Tenga en cuenta que esta terminología de fecha y hora no se ha estandarizado (todavía). La idea de la duración del estándar ISO-8601 es lo que Joda-Time considera a . Se ha planteado una propuesta para estandarizar dicha terminología, pero aún no se ha logrado. Period
Basil Bourque

Respuestas:

246

Se necesitan 3 clases porque representan conceptos diferentes, por lo que se trata de elegir el apropiado para el trabajo en lugar de un rendimiento relativo. De la documentación con comentarios añadidos por mí en cursiva :


Un intervalo en Joda-Time representa un intervalo de tiempo de un milisegundo instantáneo a otro instantáneo. Ambos instantes son instantes completamente especificados en el continuo de fecha y hora, completo con zona horaria. Se definen tiempos específicos, por ejemplo, este podría ser el intervalo entre las 20: 00: 00GMT de ayer y las 09: 00: 00GMT de esta mañana.

Una duración en Joda-Time representa una duración de tiempo medida en milisegundos. La duración a menudo se obtiene de un intervalo. es decir, podemos restar el inicio del final de un intervalo para obtener una duración

UNA período en Joda-Time representa un período de tiempo definido en términos de campos, por ejemplo, 3 años 5 meses 2 días y 7 horas. Esto difiere de una duración en que es inexacto en términos de milisegundos. Un período solo se puede resolver a un número exacto de milisegundos especificando el instante (incluida la cronología y la zona horaria) con el que se relaciona. por ejemplo, considere el período de 1 año, si agregamos esto al 1 de enero, siempre llegaremos al próximo 1 de enero, pero la duración dependerá de si el año intermedio es bisiesto o no. Del mismo modo, si agregamos 1 mes al 1 de un mes, llegaremos al 1 del mes siguiente, pero la duración (en milisegundos) variará según el mes en cuestión


Para la pregunta 3, un método específico para dividir una duración no es realmente necesario porque siempre podemos obtener el número de milisegundos de la duración como un long (usar getMillis()), dividirlo y construir una nueva duración (usar new Duration(long duration)).

Dividir un período realmente no tiene un significado real basado en la definición de un período anterior. Por ejemplo, ¿qué es medio mes? (su duración dependerá de qué mes).

mikej
fuente
1
Creo que dividir un período tiene un significado: medio mes sigue siendo una unidad de tiempo válida, pero requiere una fecha de inicio para saber exactamente cuánto tiempo (exactamente de la misma manera que un mes es un período válido).
Hadley
11
Jodatime considera que un período es una tupla de campos con valores INTEGER, no permite valores fraccionarios. Eso es consistente con el uso común (civil). Prácticamente nadie en la vida común considera que '1 mes y 10 días' dividido entre dos es 'medio mes y 5 días'. Si necesita hacer esa división, probablemente quiera ir a una duración (tiempo físico).
leonbloy
90

Para agregar a la respuesta de mikej :

Una duración de Joda-Time es un intervalo de tiempo "físico"; p.ej:

12000 milliseconds <- esta es una duración

Un intervalo Joda-Time es en realidad un par de instantes (inicio instantáneo - final instantáneo). Un instante es, nuevamente, un concepto "físico", un punto en la línea de tiempo. Por ejemplo (solo una posible notación):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- este es un intervalo

Un intervalo , entonces, puede convertirse a una duración , pero no a la inversa.

Considere estos dos intervalos:

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)

Como intervalos, I1y I2son diferentes, porque los puntos finales son diferentes; pero si los convierto a duraciones, obtengo lo mismo:3600000 milliseconds .

(Analogía matemática: los intervalos [10,12]y [95,97]son intervalos diferentes , pero tienen la misma longitud : la "longitud del intervalo" se asigna a la duración ).

Finalmente, un período es un lapso de "tiempo civil", expresado como un número de meses, días, horas, etc. No representa, por sí mismo, un intervalo "físico", por lo tanto, no puede convertirse directamente en un duración (los meses tienen longitudes variables ...).

Esto responde a la pregunta 3: solo puedes dividir por dos un tiempo físico (una duración).

leonbloy
fuente
Cuatro meses dividido por dos serían dos meses. ¿Por qué no es eso válido?
Hadley
1
¿Cómo calcularías '2 meses? ¿18 días dividido por 3? No puede obtener una definición coherente para ese tipo de operación.
leonbloy
3
Creo que puede obtener una definición coherente, pero debe considerarla como 1/3 del tiempo de "2 meses y 18 días". No podrá calcular exactamente qué es hasta que lo convierta en un intervalo. El hecho de que JODA no sea compatible no significa que no sea válido.
Hadley
@hadley No hay una definición civil para "un tercio del día". Por ejemplo, ningún contrato es válido por un tercio de día.
ipavlic
44
@ Richard Watson Los días pueden durar 23, 24 o 25 horas, debido al horario de verano. Por lo tanto, "un tercio del día a partir de ..." es válido, pero solo "un tercio" no lo es.
ipavlic