Moment: Memanggil moment.utc("2016-07-01").year (2013).toString() memberikan tanggal yang salah

Dibuat pada 13 Okt 2017  ·  4Komentar  ·  Sumber: moment/moment

Deskripsi Masalah dan Langkah Reproduksi:

Sepertinya ketika mengatur tanggal ke tanggal di masa lalu dan kemudian mengatur tahun ke apa pun akan mendorong tanggal yang dikeluarkan menjadi akhir bulan.

Jika Anda menelepon moment.utc("2016-07-01").year(2013).toString() Anda akan mendapatkan Wed Jul 31 2013 00:00:00 GMT+0000 . Perhatikan bagaimana 31 Juli dan bukan 01 Juli.

Lingkungan:

Saya telah mereproduksi ini di Chrome 61 serta di Node 5.10.1

Informasi lain yang mungkin berguna:

Ini sepertinya hanya menjadi masalah jika Anda menggunakan tanggal dari tahun 2016. Jika Anda mencoba moment.utc("2015-07-01").year(2013).toString() itu berfungsi dengan baik.

Saya dapat mengonfirmasi bahwa ini bukan masalah sebelum momen 2.19.0+. Ini hanya masalah dari 2.19.0+

Jika Anda melaporkan masalah, jalankan kode berikut di lingkungan yang Anda gunakan dan sertakan hasilnya:

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

Komentar yang paling membantu

@HolgerFrank Maukah Anda mengirimkan PR dengan perubahan Anda untuk memperbaikinya? Ini adalah bug yang cukup kritis yang harus diperbaiki secepatnya..

Sunting: Saya menyerahkan PR, tidak sabar.

Semua 4 komentar

Di versi 2.19.0 fungsi set$1() diubah.

Karena perubahan ini, menetapkan tahun baru untuk momen tahun kabisat, selalu menetapkan hari terakhir bulan sebagai tanggal.

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

Implementasi saat ini (salah)

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

Karena kasus khusus hanya diperlukan untuk tanggal 29 Februari di tahun kabisat, implementasi yang benar adalah:

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

Karena ini adalah kesalahan kritis, itu harus diperbaiki sesegera mungkin.

maaf baru menyadari saya menulis "Saya dapat mengonfirmasi bahwa ini bukan masalah sebelum momen 1.19.0+. Ini hanya masalah dari 1.19.0+" tapi sebenarnya maksud saya 2.19 ... saya memperbarui ini di posting asli

@HolgerFrank Maukah Anda mengirimkan PR dengan perubahan Anda untuk memperbaikinya? Ini adalah bug yang cukup kritis yang harus diperbaiki secepatnya..

Sunting: Saya menyerahkan PR, tidak sabar.

Menutup mendukung PR.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat