web-dev-qa-db-fra.com

Joda-Time: quelle est la différence entre Période, Intervalle et Durée?

Dans Joda-Time 2, quelle est la différence entre les trois types de durée:

  • période
  • intervalle
  • Durée

    1. Pourquoi avons-nous besoin de trois classes?

    2. Lequel fonctionne mieux?

    3. Pourquoi divise-t-il une instance de Période ou Durée ou Intervalle non implémentée? Par exemple. p = p.divideBy(2);

189
Gerard

Trois classes sont nécessaires car elles représentent différents concepts. Il est donc important de choisir celui qui convient le mieux au travail plutôt que la performance relative. De la documentation avec les commentaires ajoutés par moi dans italiques:


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

Une durée dans Joda-Time représente une durée mesurée en millisecondes. La durée est souvent obtenue à partir d'un intervalle. i.e. on peut soustraire début à la fin d'un intervalle pour obtenir une durée

Une période dans Joda-Time représente une période 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 qu’en un nombre exact de millisecondes en spécifiant l’instant (y compris la chronologie et le fuseau horaire) auquel elle se rapporte. par exemple. Considérons la période d'un an. Si nous ajoutons cela au 1er janvier, nous arriverons toujours au 1er janvier suivant, mais sa durée dépendra du fait que l'année écoulée soit une année bissextile ou non. De même si nous ajoutons 1 mois au 1er d'un mois, nous arriverons 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 à partir de la durée sous la forme d'un long (en utilisant getMillis()), le diviser et le construire une nouvelle durée (en utilisant new Duration(long duration)).

Diviser une période n'a pas vraiment de sens si on se base sur la définition d'une période ci-dessus. par exemple. qu'est-ce qu'un demi-mois? (sa longueur dépend de quel mois).

243
mikej

Pour ajouter à réponse de mikej :

Une Joda-Time durée 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 - fin instantanée). 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 alors être converti en une 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, I1 Et I2 Sont différents, car les points d'extrémité sont différents. mais si je les convertis en durées, j'obtiens la même chose: 3600000 milliseconds.

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

Enfin, une période est un laps de temps "civil", exprimé en nombre de mois, jours, heures, etc. Il ne fait pas -par lui-même - représente un intervalle "physique", il ne peut donc pas être converti directement en une durée (les mois ont des longueurs variables ...).

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

87
leonbloy