Moment: moment.utc( "2016-07-01")。year(2013).toString()を呼び出すと、間違った日付が提供されます

作成日 2017年10月13日  ·  4コメント  ·  ソース: moment/moment

問題の説明と再現手順:

日付を過去の日付に設定してから年を任意に設定すると、出力された日付が月末になるようにプッシュされるようです。

あなたが呼び出す場合moment.utc("2016-07-01").year(2013).toString()あなたが取得しますWed Jul 31 2013 00:00:00 GMT+0000 。 7月1日ではなく7月31日であることに注意してください。

環境:

これをChrome61とNode5.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を送信して

編集:私はPRを提出しました、待つことができませんでした。

全てのコメント4件

バージョン2.19.0では、関数set $ 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);
        }
    }
}

特殊なケースはうるう年の2月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を送信して

編集:私はPRを提出しました、待つことができませんでした。

PRを支持して閉会。

このページは役に立ちましたか?
0 / 5 - 0 評価