Moment: ¿Es una forma de .add () o .subtract () valores flotantes?

Creado en 20 jun. 2015  ·  3Comentarios  ·  Fuente: 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

Por ahora, tengo que hacer:

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

¿Por qué estos métodos no pueden sumar o restar valores flotantes?

Comentario más útil

Esto es por diseño, pero probablemente podría explicarse mejor en la documentación.

Puede usar decimales al sumar o restar horas, minutos, segundos o milisegundos, pero no puede subdividir días o componentes más grandes.

La razón es que existe una diferencia lógica entre la matemática del tiempo y la matemática de la fecha.

La matemática de tiempo asume una escala de tiempo lineal, simplemente aumentando o disminuyendo la marca de tiempo basada en UTC. Esto maneja las transiciones de DST en tiempo real. Por ejemplo, para la mayoría de los lugares en los Estados Unidos, 2015-03-08T01:00:00 más una hora sería 2015-03-08T03:00:00 porque la hora de 2:00 a 3:00 se omitió para la transición de horario de verano.

La matemática de fechas no usa una escala de tiempo lineal, sino que usa las fechas en el calendario. Usando el mismo ejemplo, 2015-03-08T01:00:00 más un _día_ sería 2015-03-09T01:00:00 , aunque solo hayan pasado 23 horas. Por lo tanto, un "día" en este contexto no es una cantidad fija de tiempo y, por lo tanto, subdividirlo sería una tontería. (¿Medio día sería 12 horas más tarde o 11,5 horas más tarde en este día?)

Incluso sin DST, considere que no todos los meses son 30 días y no todos los años son 365 días. "Agregar" un año no significa realmente "agregar 365 días", significa "avanzar la posición en el calendario al mismo mes y día del año siguiente". Esto crea ciertas ambigüedades, como cuando se agrega un año al 29 de febrero en un año bisiesto y termina en un año no bisiesto. Elegimos aterrizar el 28 de febrero, pero aterrizar el 1 de marzo sería igualmente válido.

Como otro ejemplo, considere que el 31 de agosto más un mes, menos un mes, es el 30 de agosto.

Dado que la matemática de fechas no sigue las reglas normales de suma y resta de las matemáticas, tampoco puede manejar operaciones de división o multiplicación y, por lo tanto, no puede sumar 1.9 meses.

Pensándolo de otra manera, ¿cuál esperaría que fuera el resultado de la medianoche del 15 de junio + 1,5 meses? Un humano podría realizar cualquiera de las siguientes acciones:

  • 2015-06-15T00:00 + (0.5 * 30 días en junio) = 2015-06-30T00:00 + (1 mes = 30 días) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0.5 * 30 días en junio) = 2015-06-30T00:00 + (1 mes = 31 días) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 mes = 2015-07-15T00:00 + (0.5 * 31 días en julio) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 días en junio y julio / 2 = 30,5 días promedio en estos meses) * 1,5 meses = 45,75 días] = 2015-07-30T18:00

Entonces, aquí hay cuatro respuestas diferentes que son todos resultados lógicos, por lo que no puede subdividir las unidades al hacer cálculos matemáticos de fechas.

Todos 3 comentarios

Esto es por diseño, pero probablemente podría explicarse mejor en la documentación.

Puede usar decimales al sumar o restar horas, minutos, segundos o milisegundos, pero no puede subdividir días o componentes más grandes.

La razón es que existe una diferencia lógica entre la matemática del tiempo y la matemática de la fecha.

La matemática de tiempo asume una escala de tiempo lineal, simplemente aumentando o disminuyendo la marca de tiempo basada en UTC. Esto maneja las transiciones de DST en tiempo real. Por ejemplo, para la mayoría de los lugares en los Estados Unidos, 2015-03-08T01:00:00 más una hora sería 2015-03-08T03:00:00 porque la hora de 2:00 a 3:00 se omitió para la transición de horario de verano.

La matemática de fechas no usa una escala de tiempo lineal, sino que usa las fechas en el calendario. Usando el mismo ejemplo, 2015-03-08T01:00:00 más un _día_ sería 2015-03-09T01:00:00 , aunque solo hayan pasado 23 horas. Por lo tanto, un "día" en este contexto no es una cantidad fija de tiempo y, por lo tanto, subdividirlo sería una tontería. (¿Medio día sería 12 horas más tarde o 11,5 horas más tarde en este día?)

Incluso sin DST, considere que no todos los meses son 30 días y no todos los años son 365 días. "Agregar" un año no significa realmente "agregar 365 días", significa "avanzar la posición en el calendario al mismo mes y día del año siguiente". Esto crea ciertas ambigüedades, como cuando se agrega un año al 29 de febrero en un año bisiesto y termina en un año no bisiesto. Elegimos aterrizar el 28 de febrero, pero aterrizar el 1 de marzo sería igualmente válido.

Como otro ejemplo, considere que el 31 de agosto más un mes, menos un mes, es el 30 de agosto.

Dado que la matemática de fechas no sigue las reglas normales de suma y resta de las matemáticas, tampoco puede manejar operaciones de división o multiplicación y, por lo tanto, no puede sumar 1.9 meses.

Pensándolo de otra manera, ¿cuál esperaría que fuera el resultado de la medianoche del 15 de junio + 1,5 meses? Un humano podría realizar cualquiera de las siguientes acciones:

  • 2015-06-15T00:00 + (0.5 * 30 días en junio) = 2015-06-30T00:00 + (1 mes = 30 días) = 2015-07-30T00:00
  • 2015-06-15T00:00 + (0.5 * 30 días en junio) = 2015-06-30T00:00 + (1 mes = 31 días) = 2015-07-31T00:00
  • 2015-06-15T00:00 + 1 mes = 2015-07-15T00:00 + (0.5 * 31 días en julio) = 2015-07-30T12:00
  • 2015-06-15T00:00 + [(61 días en junio y julio / 2 = 30,5 días promedio en estos meses) * 1,5 meses = 45,75 días] = 2015-07-30T18:00

Entonces, aquí hay cuatro respuestas diferentes que son todos resultados lógicos, por lo que no puede subdividir las unidades al hacer cálculos matemáticos de fechas.

Muchas gracias por tomarse el tiempo de escribir esta respuesta tan detallada. Entiendo mejor la lógica detrás del funcionamiento de estas funciones.

No pude resistirme a mí mismo por agradecerle a Matt, he cruzado el mismo problema que experimentó Delgan, ¡y amigo! tu respuesta es tan completa, gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones