Joda-Time: quelle est la différence entre la période, l'intervalle et la durée?


192

Dans Joda-Time 2, quelle est la différence entre les trois types d'intervalles de temps:

  • Période
  • Intervalle
  • Durée

    1. Pourquoi avons-nous besoin de trois classes?

    2. Lequel fonctionne le mieux?

    3. Pourquoi la division d' une instance Période, Durée ou Intervalle n'est-elle pas implémentée? Par exemplep = p.divideBy(2);


3
Notez que cette terminologie date-heure n'a pas (encore) été normalisée. L' idée de durée de la norme ISO-8601 est ce que Joda-Time considère comme un . Une proposition de normalisation de cette terminologie a été soulevée mais pas encore aboutie. Period
Basil Bourque

Réponses:


246

3 classes sont nécessaires car elles représentent des concepts différents, il s'agit donc de choisir celle qui convient à l'emploi plutôt que de la performance relative. De la documentation avec des commentaires ajoutés par moi en italique :


Un intervalle dans Joda-Time représente un intervalle de temps entre un instant de la milliseconde et un autre instant. Les deux instants sont des instants entièrement spécifiés dans le continuum datetime, avec le fuseau horaire. Des heures spécifiques sont définies, par exemple, cela pourrait être l'intervalle entre 20: 00: 00GMT hier et 09: 00: 00GMT ce matin.

Une durée en Joda-Time représente une durée de temps mesurée en millisecondes. La durée est souvent obtenue à partir d'un intervalle. c'est-à-dire que nous pouvons soustraire le début de la fin d'un intervalle pour dériver une durée

Une période dans Joda-Time représente une période de temps définie en termes de champs, par exemple 3 ans 5 mois 2 jours et 7 heures. Cela diffère d'une durée en ce qu'elle est inexacte en termes de millisecondes. Une période ne peut être résolue en un nombre exact de millisecondes qu'en spécifiant l'instant (y compris la chronologie et le fuseau horaire) auquel elle est relative. Par exemple, considérez la période d'un an, si nous ajoutons cela au 1er janvier, nous arriverons toujours au 1er janvier suivant, mais la durée dépendra du fait que l'année intermédiaire est une année bissextile ou non. De même si on ajoute 1 mois au 1er d'un mois alors on arrivera au 1er du mois suivant mais la durée (en millisecondes) variera en fonction du mois en question


Pour la question 3, une méthode spécifique pour diviser une durée n'est pas vraiment nécessaire car nous pouvons toujours obtenir le nombre de millisecondes de la durée en tant que long(en utilisant getMillis()), le diviser et construire une nouvelle durée (en utilisant new Duration(long duration)).

Diviser une période n'a pas vraiment de sens réel basé sur la définition d'une période ci-dessus. par exemple, qu'est-ce qu'un demi-mois? (sa longueur dépendrait du mois).


1
Je pense que diviser une période a un sens - un demi-mois est toujours une unité de temps valide, mais il faut une date de début pour savoir exactement combien de temps (exactement de la même manière qu'un mois est une période valide).
hadley

11
Jodatime considère une période comme un tuple de champs de valeur INTEGER, il n'autorise pas les valeurs fractionnaires. Cela correspond à une utilisation courante (civile). Pratiquement personne dans la vie commune ne considère que «1 mois et 10 jours» divisé par deux équivaut à «un demi-mois et 5 jours». Si vous devez faire cette division, vous voudrez probablement aller à une durée (temps physique).
leonbloy

90

Pour ajouter à la réponse de mikej :

Une durée Joda-Time est un intervalle de temps "physique"; par exemple:

12000 milliseconds <- c'est une durée

Un intervalle Joda-Time est en fait une paire d' instants (instant de début - instant de fin). Un instant est, encore une fois, un concept «physique», un point dans la chronologie. Par exemple (juste une notation possible):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- c'est un intervalle

Un intervalle peut donc être converti en durée , mais pas l'inverse.

Considérez ces deux intervalles:

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)

En tant qu'intervalles, I1et I2sont différents, parce que les points d'extrémité sont différents; mais si je les convertir à des durées, je reçois la même chose: 3600000 milliseconds.

(Analogie mathématique: les intervalles [10,12]et [95,97]sont des intervalles différents , mais ils ont la même longueur : "longueur d'intervalle" correspond à la durée ).

Enfin, une période est un intervalle de «temps civil», exprimé en nombre de mois, de jours, d’heures, etc. durée (les mois ont des durées variables ...).

Cela répond à la question 3: vous ne pouvez diviser que par deux un temps physique (une durée).


Quatre mois divisés par deux équivaudraient à deux mois. Pourquoi n'est-ce pas valable?
hadley

1
Comment calculeriez-vous «2 mois; 18 jours divisé par 3? Vous ne pouvez pas obtenir une définition cohérente de ce type d'opération.
leonbloy

3
Je pense que vous pouvez obtenir une définition cohérente, mais vous devez y penser comme 1/3 du temps de «2 mois et 18 jours». Vous ne pourrez pas déterminer exactement ce que c'est tant que vous ne l'aurez pas converti en intervalle. Ce n'est pas parce que JODA ne prend pas en charge qu'il est invalide.
hadley

@hadley Il n'y a pas de définition civile pour "un tiers de jour". Par exemple, aucun contrat n'est valable un tiers de jour.
ipavlic

4
Les jours @Richard Watson peuvent durer 23, 24 ou 25 heures, en raison de l'heure d'été. Par conséquent, "un tiers de jour à partir de ..." est valable, mais seulement "un tiers" ne l'est pas.
ipavlic
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.