Moment: L'appel de moment.utc("2016-07-01").year(2013).toString() fournit la mauvaise date

Créé le 13 oct. 2017  ·  4Commentaires  ·  Source: moment/moment

Description du problème et étapes à reproduire :

Il semble que lorsque vous définissez la date sur une date dans le passé, puis que vous définissez l'année sur n'importe quoi, la date de sortie sera à la fin du mois.

Si vous appelez moment.utc("2016-07-01").year(2013).toString() vous obtiendrez Wed Jul 31 2013 00:00:00 GMT+0000 . Remarquez comment c'est le 31 juillet et non le 01 juillet.

Environnement:

J'ai reproduit cela dans Chrome 61 ainsi que dans Node 5.10.1

Autres informations pouvant être utiles :

Cela ne semble être un problème que si vous utilisez une date de l'année 2016. Si vous essayez moment.utc("2015-07-01").year(2013).toString() cela fonctionne bien.

Je peux confirmer que ce n'est pas un problème antérieur au moment 2.19.0+. Ce n'est qu'un problème à partir de 2.19.0+

Si vous signalez un problème, veuillez exécuter le code suivant dans l'environnement que vous utilisez et inclure la sortie :

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

Commentaire le plus utile

@HolgerFrank Pourriez-vous soumettre un PR avec votre modification pour résoudre ce problème ? C'est un bug assez critique qui devrait être corrigé dès que possible.

Edit : j'ai soumis le PR, je ne pouvais pas attendre.

Tous les 4 commentaires

Dans la version 2.19.0, la fonction set$1() a été modifiée.

En raison de ce changement, définissant une nouvelle année pour un moment d'année bissextile, il définit toujours le dernier jour du mois comme date.

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

Implémentation actuelle (incorrecte)

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);
        }
    }
}

Étant donné que le cas spécial n'est nécessaire que pour le 29 février les années bissextiles, la mise en œuvre correcte devrait être :

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);
        }
    }
}

Parce qu'il s'agit d'une erreur critique, elle doit être corrigée dès que possible.

désolé, je viens de remarquer que j'ai écrit "Je peux confirmer qu'il ne s'agit pas d'un problème antérieur au moment 1.19.0+. Ce n'est qu'un problème à partir de 1.19.0+" mais je voulais en fait dire 2.19... j'ai mis à jour cela dans le message d'origine

@HolgerFrank Pourriez-vous soumettre un PR avec votre modification pour résoudre ce problème ? C'est un bug assez critique qui devrait être corrigé dès que possible.

Edit : j'ai soumis le PR, je ne pouvais pas attendre.

Clôture en faveur de PR.

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