Moment: Al llamar a moment.utc ("2016-07-01"). Year (2013) .toString () proporciona la fecha incorrecta

Creado en 13 oct. 2017  ·  4Comentarios  ·  Fuente: moment/moment

Descripción del problema y pasos para reproducirlo:

Parece que cuando se establece la fecha en una fecha en el pasado y luego se establece el año en cualquier cosa, la fecha de salida se moverá al final del mes.

Si llama a moment.utc("2016-07-01").year(2013).toString() obtendrá Wed Jul 31 2013 00:00:00 GMT+0000 . Observe cómo es el 31 de julio y no el 1 de julio.

Medio ambiente:

He reproducido esto en Chrome 61 y en el nodo 5.10.1

Otra información que puede ser útil:

Esto parece ser un problema solo si está usando una fecha del año 2016. Si prueba moment.utc("2015-07-01").year(2013).toString() , funciona bien.

Puedo confirmar que esto no es un problema anterior al momento 2.19.0+. Solo es un problema de 2.19.0+

Si informa un problema, ejecute el siguiente código en el entorno que está utilizando e incluya el resultado:

console.log( (new Date()).toString())
console.log((new Date()).toLocaleString())
console.log( (new Date()).getTimezoneOffset())
console.log( navigator.userAgent)
console.log(moment.version)
Thu Oct 12 2017 23:10:36 GMT-0300 (ADT)
10/12/2017, 11:10:36 PM
180
Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
2.19.1

Comentario más útil

@HolgerFrank ¿Le importaría enviar un PR con su cambio para solucionar este problema? Es un error bastante crítico que debería arreglarse lo antes posible.

Editar: envié el PR, no podía esperar.

Todos 4 comentarios

En la versión 2.19.0 se cambió el conjunto de funciones $ 1 ().

Debido a este cambio, al establecer un año nuevo para un momento de año bisiesto, siempre establece el último día del mes como fecha.

moment('2010-02-25').year(2017) // result is: 2017-02-28
moment('2010-10-15').year(2017) // result is: 2017-10-31

Implementación actual (incorrecta)

function set$1 (mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (unit === 'FullYear' && isLeapYear(mom.year())) {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month()));
        }
        else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

Debido a que el caso especial solo es necesario para el 29 de febrero en años bisiestos, la implementación correcta debe ser:

function set$1 (mom, unit, value) {
    if (mom.isValid() && !isNaN(value)) {
        if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, 1, daysInMonth(value, 1));
        }
        else {
            mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
        }
    }
}

Dado que se trata de un error crítico, debe corregirse lo antes posible.

lo siento, acabo de notar que escribí "Puedo confirmar que esto no es un problema anterior al momento 1.19.0+. Solo es un problema de 1.19.0+" pero en realidad quise decir 2.19 ... he actualizado esto en la publicación original

@HolgerFrank ¿Le importaría enviar un PR con su cambio para solucionar este problema? Es un error bastante crítico que debería arreglarse lo antes posible.

Editar: envié el PR, no podía esperar.

Cierre a favor de PR.

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