Moment: Chamar moment.utc ("2016-07-01"). Year (2013) .toString () fornece a data errada

Criado em 13 out. 2017  ·  4Comentários  ·  Fonte: moment/moment

Descrição do problema e etapas para reproduzir:

Parece que, ao definir a data para uma data no passado e, em seguida, definir o ano para qualquer coisa empurrará a data de saída para o final do mês.

Se você chamar moment.utc("2016-07-01").year(2013).toString() , receberá Wed Jul 31 2013 00:00:00 GMT+0000 . Observe como é 31 de julho e não 01 de julho.

Ambiente:

Eu reproduzi isso no Chrome 61, bem como no Node 5.10.1

Outras informações que podem ser úteis:

Isso parece ser um problema apenas se você estiver usando uma data do ano de 2016. Se você tentar moment.utc("2015-07-01").year(2013).toString() , funcionará bem.

Posso confirmar que este não é um problema anterior ao momento 2.19.0+. É apenas um problema de 2.19.0+

Se você estiver relatando um problema, execute o seguinte código no ambiente que está usando e inclua a saída:

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

Comentários muito úteis

@HolgerFrank Você se importaria de enviar um PR com sua alteração para corrigir isso? É um bug bastante crítico que deve ser corrigido o mais rápido possível.

Edit: Eu enviei o PR, não podia esperar.

Todos 4 comentários

Na versão 2.19.0, o conjunto de funções $ 1 () foi alterado.

Por causa dessa mudança, definindo um novo ano para um momento de ano bissexto, ele sempre define o último dia do mês como data.

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

Implementação atual (incorreta)

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

Como o caso especial só é necessário para 29 de fevereiro em anos bissextos, a implementação correta deve 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);
        }
    }
}

Por ser um erro crítico, ele deve ser corrigido o mais rápido possível.

desculpe, acabei de notar que escrevi "Posso confirmar que este não é um problema anterior ao momento 1.19.0+. É apenas um problema de 1.19.0+", mas na verdade eu quis dizer 2.19 ... ive atualizou isso no post original

@HolgerFrank Você se importaria de enviar um PR com sua alteração para corrigir isso? É um bug bastante crítico que deve ser corrigido o mais rápido possível.

Edit: Eu enviei o PR, não podia esperar.

Encerramento a favor do PR.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

danieljsinclair picture danieljsinclair  ·  3Comentários

paulyoung picture paulyoung  ·  3Comentários

tanepiper picture tanepiper  ·  3Comentários

M-Zuber picture M-Zuber  ·  3Comentários

ghost picture ghost  ·  3Comentários