Moment: Вызов moment.utc ("2016-07-01"). Year (2013) .toString () дает неверную дату

Созданный на 13 окт. 2017  ·  4Комментарии  ·  Источник: moment/moment

Описание проблемы и шаги по воспроизведению:

Похоже, что при установке даты на дату в прошлом, а затем при установке любого года на что-либо, выводимая дата будет находиться в конце месяца.

Если вы позвоните на moment.utc("2016-07-01").year(2013).toString() вы получите Wed Jul 31 2013 00:00:00 GMT+0000 . Обратите внимание, это 31 июля, а не 01 июля.

Среда:

Я воспроизвел это в Chrome 61, а также в Node 5.10.1.

Другая информация, которая может быть полезна:

Кажется, это проблема только в том случае, если вы используете дату за 2016 год. Если вы попробуете moment.utc("2015-07-01").year(2013).toString() все будет нормально.

Я могу подтвердить, что это не проблема до момента 2.19.0+. Проблема только в версии 2.19.0+.

Если вы сообщаете о проблеме, запустите следующий код в среде, которую вы используете, и включите вывод:

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

Самый полезный комментарий

@HolgerFrank Не

Изменить: я отправил PR, не мог дождаться.

Все 4 Комментарий

В версии 2.19.0 набор функций $ 1 () был изменен.

Из-за этого изменения при установке нового года в качестве момента високосного года всегда устанавливается последний день месяца как дата.

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

Текущая (неправильная) реализация

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

Поскольку особый случай необходим только для 29 февраля в високосные годы, правильная реализация должна быть такой:

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

Поскольку это критическая ошибка, ее следует исправить как можно скорее.

извините, только заметил, что я написал: «Я могу подтвердить, что это не проблема до момента 1.19.0+. Это проблема только с 1.19.0+», но на самом деле я имел в виду 2.19 ... я обновил это в исходном сообщении

@HolgerFrank Не

Изменить: я отправил PR, не мог дождаться.

Закрытие в пользу пиара.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги