Moment: Est-ce un moyen d'ajouter des valeurs flottantes .add() ou .subtract() ?

Créé le 20 juin 2015  ·  3Commentaires  ·  Source: moment/moment

moment().add(1, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
moment().add(1.9, "months") // >> Mon Jul 20 2015 13:36:12 GMT+0200
// Excpected: Mon Aug 17 2015 09:34:37 GMT+0200

Pour l'instant je dois faire :

var duration = moment.duration(1.9, "months"); 
var ms = duration.asMilliseconds();
var date = moment().add(ms, "ms");

Pourquoi ces méthodes ne peuvent-elles pas ajouter ou soustraire des valeurs flottantes ?

Commentaire le plus utile

C'est par conception, mais cela pourrait probablement être mieux expliqué dans la documentation.

Vous pouvez utiliser des décimales lors de l'ajout ou de la soustraction d'heures, de minutes, de secondes ou de millisecondes, mais vous ne pouvez pas subdiviser des jours ou des composants plus grands.

La raison en est qu'il existe une différence logique entre les mathématiques de l'heure et les mathématiques de la date.

Les calculs de temps supposent une échelle de temps linéaire, incrémentant ou décrémentant simplement l'horodatage basé sur UTC. Cela gère les transitions DST en temps réel. Par exemple, pour la plupart des endroits aux États-Unis, 2015-03-08T01:00:00 plus une heure serait 2015-03-08T03:00:00 car l'heure de 2:00 à 3:00 a été ignorée pour la transition DST.

Le calcul des dates n'utilise pas d'échelle de temps linéaire, mais utilise plutôt les dates du calendrier. En utilisant le même exemple, 2015-03-08T01:00:00 plus un _jour_ serait 2015-03-09T01:00:00 , même si seulement 23 heures se sont écoulées. Par conséquent, un "jour" est ce contexte n'est pas une durée fixe, et donc le subdiviser serait absurde. (Une demi-journée serait-elle 12 heures plus tard, ou 11,5 heures plus tard ce jour-là ?)

Même sans DST, considérez que tous les mois ne sont pas 30 jours, et toutes les années ne sont pas 365 jours. « Ajouter » une année ne signifie pas vraiment « ajouter 365 jours », cela signifie « avancer la position sur le calendrier au même mois et au même jour de l'année suivante ». Cela crée certaines ambiguïtés, comme lors de l'ajout d'un an au 29 février dans une année bissextile et se terminant dans une année non bissextile. Nous choisissons d'atterrir le 28 février, mais l'atterrissage le 1er mars serait tout aussi valable.

Comme autre exemple, considérons que le 31 août plus un mois, moins un mois, correspond au 30 août.

Étant donné que les mathématiques de date ne suivent pas les règles normales d'addition et de soustraction des mathématiques, elles ne peuvent pas non plus gérer les opérations de division ou de multiplication, et vous ne pouvez donc pas ajouter 1,9 mois.

Pour y réfléchir autrement, à quoi vous attendriez-vous le résultat du 15 juin minuit + 1,5 mois ? L'une des actions suivantes peut être effectuée par un humain :

  • 2015-06-15T00:00 + (0,5 * 30 jours en juin) = 2015-06-30T00:00 + (1 mois = 30 jours) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 jours en juin) = 2015-06-30T00:00 + (1 mois = 31 jours) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 mois = 2015-07-15T00:00 + (0,5 * 31 jours en juillet) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 jours en juin et juillet / 2 = 30,5 jours en moyenne dans ces mois) * 1,5 mois = 45,75 jours] = 2015-07-30T18:00

Voici donc quatre réponses différentes qui sont toutes des résultats logiques - c'est pourquoi vous ne pouvez pas subdiviser les unités lorsque vous faites des calculs de date.

Tous les 3 commentaires

C'est par conception, mais cela pourrait probablement être mieux expliqué dans la documentation.

Vous pouvez utiliser des décimales lors de l'ajout ou de la soustraction d'heures, de minutes, de secondes ou de millisecondes, mais vous ne pouvez pas subdiviser des jours ou des composants plus grands.

La raison en est qu'il existe une différence logique entre les mathématiques de l'heure et les mathématiques de la date.

Les calculs de temps supposent une échelle de temps linéaire, incrémentant ou décrémentant simplement l'horodatage basé sur UTC. Cela gère les transitions DST en temps réel. Par exemple, pour la plupart des endroits aux États-Unis, 2015-03-08T01:00:00 plus une heure serait 2015-03-08T03:00:00 car l'heure de 2:00 à 3:00 a été ignorée pour la transition DST.

Le calcul des dates n'utilise pas d'échelle de temps linéaire, mais utilise plutôt les dates du calendrier. En utilisant le même exemple, 2015-03-08T01:00:00 plus un _jour_ serait 2015-03-09T01:00:00 , même si seulement 23 heures se sont écoulées. Par conséquent, un "jour" est ce contexte n'est pas une durée fixe, et donc le subdiviser serait absurde. (Une demi-journée serait-elle 12 heures plus tard, ou 11,5 heures plus tard ce jour-là ?)

Même sans DST, considérez que tous les mois ne sont pas 30 jours, et toutes les années ne sont pas 365 jours. « Ajouter » une année ne signifie pas vraiment « ajouter 365 jours », cela signifie « avancer la position sur le calendrier au même mois et au même jour de l'année suivante ». Cela crée certaines ambiguïtés, comme lors de l'ajout d'un an au 29 février dans une année bissextile et se terminant dans une année non bissextile. Nous choisissons d'atterrir le 28 février, mais l'atterrissage le 1er mars serait tout aussi valable.

Comme autre exemple, considérons que le 31 août plus un mois, moins un mois, correspond au 30 août.

Étant donné que les mathématiques de date ne suivent pas les règles normales d'addition et de soustraction des mathématiques, elles ne peuvent pas non plus gérer les opérations de division ou de multiplication, et vous ne pouvez donc pas ajouter 1,9 mois.

Pour y réfléchir autrement, à quoi vous attendriez-vous le résultat du 15 juin minuit + 1,5 mois ? L'une des actions suivantes peut être effectuée par un humain :

  • 2015-06-15T00:00 + (0,5 * 30 jours en juin) = 2015-06-30T00:00 + (1 mois = 30 jours) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0,5 * 30 jours en juin) = 2015-06-30T00:00 + (1 mois = 31 jours) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 mois = 2015-07-15T00:00 + (0,5 * 31 jours en juillet) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 jours en juin et juillet / 2 = 30,5 jours en moyenne dans ces mois) * 1,5 mois = 45,75 jours] = 2015-07-30T18:00

Voici donc quatre réponses différentes qui sont toutes des résultats logiques - c'est pourquoi vous ne pouvez pas subdiviser les unités lorsque vous faites des calculs de date.

Merci beaucoup d'avoir pris le temps d'écrire cette réponse très détaillée. Je comprends mieux la logique derrière le fonctionnement de ces fonctions.

Je n'ai pas pu résister à moi-même pour remercier Matt, j'ai rencontré le même problème que Delgan a connu, et mon pote! votre réponse est si complète, merci.

Cette page vous a été utile?
0 / 5 - 0 notes