Mengapa moment.js UTC selalu menunjukkan tanggal yang salah. Misalnya dari konsol pengembang chrome:
moment(('07-18-2013')).utc().format("YYYY-MM-DD").toString()
// or
moment.utc(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Keduanya akan mengembalikan "2013-07-17" mengapa mengembalikan ke 17, bukan 18 , yang diteruskan.
Tetapi jika saya menggunakan momentjs tanpa utc:
moment(new Date('07-18-2013')).format("YYYY-MM-DD").toString()
Saya mendapatkan kembali "2013-07-18" yang juga saya harapkan saat menggunakan moment.js UTC.
Apakah ini berarti kita tidak bisa mendapatkan tanggal yang benar saat menggunakan moment.js UTC?
toString()
setelahformat()
(itu sudah mengembalikan string).Jawaban:
Secara default, MomentJS mengurai dalam waktu lokal. Jika hanya string tanggal (tanpa waktu) yang disediakan, default waktunya adalah tengah malam.
Dalam kode Anda, Anda membuat tanggal lokal dan kemudian mengonversinya ke zona waktu UTC (pada kenyataannya, itu membuat momen instan beralih ke mode UTC ), jadi ketika diformat, itu bergeser (tergantung pada waktu lokal Anda) maju atau ke belakang.
Jika zona waktu lokal adalah UTC + N (N adalah angka positif), dan Anda mengurai string khusus tanggal, Anda akan mendapatkan tanggal sebelumnya.
Berikut adalah beberapa contoh untuk mengilustrasikannya (offset waktu lokal saya adalah UTC + 3 selama DST):
>>> moment('07-18-2013', 'MM-DD-YYYY').utc().format("YYYY-MM-DD HH:mm") "2013-07-17 21:00" >>> moment('07-18-2013 12:00', 'MM-DD-YYYY HH:mm').utc().format("YYYY-MM-DD HH:mm") "2013-07-18 09:00" >>> Date() "Thu Jul 25 2013 14:28:45 GMT+0300 (Jerusalem Daylight Time)"
Jika Anda ingin string tanggal-waktu ditafsirkan sebagai UTC, Anda harus menjelaskannya secara eksplisit:
>>> moment(new Date('07-18-2013 UTC')).utc().format("YYYY-MM-DD HH:mm") "2013-07-18 00:00"
atau, seperti yang disebutkan Matt Johnson dalam jawabannya, Anda dapat ( dan mungkin harus ) menguraikannya sebagai tanggal UTC sejak awal menggunakan
moment.utc()
dan menyertakan string format sebagai argumen kedua untuk mencegah ambiguitas.>>> moment.utc('07-18-2013', 'MM-DD-YYYY').format("YYYY-MM-DD HH:mm") "2013-07-18 00:00"
Untuk sebaliknya dan mengubah tanggal UTC menjadi tanggal lokal, Anda dapat menggunakan
local()
metode ini, sebagai berikut:>>> moment.utc('07-18-2013', 'MM-DD-YYYY').local().format("YYYY-MM-DD HH:mm") "2013-07-18 03:00"
sumber
new Date('07-18-2013 UTC')
tidak akan berfungsi di IE8, jika Anda peduli.Keduanya
Date
danmoment
akan mengurai string input dalam zona waktu lokal browser secara default. NamunDate
terkadang tidak konsisten dengan hal ini. Jika stringnya secara khususYYYY-MM-DD
, menggunakan tanda hubung , atau jika yaYYYY-MM-DD HH:mm:ss
, itu akan menafsirkannya sebagai waktu lokal . Tidak sepertiDate
,moment
akan selalu konsisten tentang cara mengurai.Cara yang benar untuk mengurai momen masukan sebagai UTC dalam format yang Anda berikan adalah seperti ini:
moment.utc('07-18-2013', 'MM-DD-YYYY')
Lihat dokumentasi ini .
Jika Anda ingin memformatnya secara berbeda untuk keluaran, Anda akan melakukan ini:
moment.utc('07-18-2013', 'MM-DD-YYYY').format('YYYY-MM-DD')
Anda tidak perlu menelepon
toString
secara eksplisit.Perhatikan bahwa sangat penting untuk memberikan format masukan. Tanpanya, tanggal seperti
01-04-2013
mungkin akan diproses sebagai 4 Jan atau 1 April, tergantung pada pengaturan budaya browser.sumber
moment
di konsol tidak terlalu berguna. Anda mungkin melihat salah satu properti internalnya. Anda harus memformatnya sebelum memeriksa hasilnya. Misalnyamoment.utc().format()
ataumoment().format()
.new Date('2010-12-12')
memberi sayaDate {Sat Dec 11 2010 19:00:00 GMT-0500 (Eastern Daylight Time)}
di FF 38.0.5. Hanya untuk mengontekstualisasikan apa arti "dalam waktu lokal", tepatnya - dalam hal ini, tampaknya berarti, "Date
akan menganggap string tanpa zona waktu dalam UTC dan akan mengurai ke waktu lokal."d.getUTCDate()
=12
dand.getDate()
=11
'2012-12-12'
adalah UTC b / c itu dalam format ISO, tetapi'December 12, 2012'
dan bahkan'2012/12/12'
diuraikan dengan zona waktu lokal di ES5), tetapi Anda telah mengalahkan saya untuk itu. Saking hebatnya ES6 membuat semuanya lokal [katanya sinis]. Tanggal itu