Saya mencoba untuk meneruskan kedua string tanggal ke new Date(t)
.
Saya berharap kedua string mewakili waktu yang sama, lagipula, jika saya menghilangkan waktu, bukankah seharusnya tengah malam pada hari itu?
Tapi sementara,
new Date("2016-02-16 00:00")
mengembalikan 2016-02-16, tengah malam, waktu setempat seperti yang diharapkan,
new Date("2016-02-16")
mengembalikan 2016-02-16, tengah malam UTC, yang salah, atau setidaknya tidak seperti yang saya harapkan mengingat apa yang parsing string lain.
Saya akan memahaminya jika mereka berdua memiliki perilaku yang sama, apakah itu mengembalikan waktu sebagai waktu lokal, atau sebagai UTC, tetapi tampaknya sangat tidak konsisten mengapa mereka mengembalikan hal yang berbeda seperti ini.
Sebagai solusinya, setiap kali saya menemukan tanggal yang tidak memiliki stempel waktu yang sesuai, saya dapat menambahkan "00:00" untuk mendapatkan perilaku yang konsisten, tetapi tampaknya ini agak rapuh.
Saya mendapatkan nilai ini dari elemen INPUT, jenis 'datetime-local' jadi tampaknya sangat tidak konsisten bahwa saya harus mengatasi nilai yang dikembalikan oleh elemen halaman.
Apakah saya melakukan sesuatu yang salah, atau haruskah saya melakukan sesuatu yang berbeda?
sumber
2016-02-16 00:00
- ini sama sekali bukan waktu yang valid. ecma-international.org/ecma-262/6.0/… , tetapi bahkan setelah Anda meletakkannya diT
sana memang berperilaku berbedaJawaban:
Itulah yang dikatakan spesifikasi ES5.1 :
Ia juga mengatakan:
Karena format memerlukan
T
pemisah antara tanggal dan waktu, waktu yang valid masuk ke UTC:... sementara di node.js, waktu yang tidak valid (tanpa pemisah T) tampaknya mengarah ke waktu lokal spesifik implementasi:
Perhatikan bahwa ES6 mengubah ini, di bagian yang sama dari dokumentasi itu berubah menjadi:
Sukacita dalam memecahkan perubahan .
Edit
Menurut TC39 , spesifikasi dimaksudkan untuk diinterpretasikan sebagai string tanggal dan waktu tanpa zona waktu (mis. "2016-02-16T00: 00: 00") diperlakukan sebagai lokal (sesuai ISO 8601), tetapi string hanya tanggal (mis. "2016-02-16") sebagai UTC (yang tidak konsisten dengan ISO 8601).
sumber
Menurut spesifikasinya :
Dan Format String Waktu Tanggal menerima
2016-02-16
sebagai tanggal yang validJadi
2016-02-16
diterjemahkan menjadi2016-02-16T00:00:00.000Z
.Tanggal lain
2016-02-16 00:00
tidak sesuai dengan format dan oleh karena itu penguraiannya khusus untuk penerapan. Rupanya, tanggal tersebut diperlakukan sebagai memiliki zona waktu lokal dan tanggal contoh Anda akan mengembalikan nilai yang berbeda bergantung pada zona waktu:Ringkasan:
NaN
daripada mencoba mengurai tanggal yang tidak sesuai. Cukup uji kode Anda di Internet Explorer 11;)sumber
Anda mungkin mengalami perbedaan antara penerapan ES5, ES6, dan hasil yang Anda harapkan. Per Date.parse di MDN, "terutama di seluruh implementasi ECMAScript yang berbeda di mana string seperti" 2015-10-12 12:00:00 "dapat diurai menjadi NaN, UTC, atau zona waktu lokal" signifikan.
Pengujian tambahan di Firefox 44 dan IE 11 mengungkapkan bahwa keduanya mengembalikan objek tanggal
new Date("2016-02-16 00:00")
, yang objek mengembalikan NaN saat mencoba mendapatkan nilai komponen tanggal, dan nilai toStringnya adalah "Tanggal Tidak Valid" (bukan "NaN"). Karenanya menambahkan "00:00 untuk mendapatkan perilaku yang konsisten" dapat dengan mudah merusak browser yang berbeda.Seperti dicatat dalam jawaban lain
new Date("2016-02-16")
menggunakan offset zona waktu nol secara default, menghasilkan tengah malam UTC, bukan lokal.sumber
Per
DateParser::Parse()
dari kode sumber V8 untuk Chrome.sumber
Ini menambahkan offset zona waktu ke
00:00
new Date("2016-02-16")
keluaranTue Feb 16 2016 05:30:00 GMT+0530 (India Standard Time)
Zona waktu saya adalah IST dengan nilai offset (dalam menit)
+330
, jadi ditambahkan 330 menit menjadi 00:00.Sesuai ecma-262, bagian 20.3.3.2 Date.parse (string)
Ketika Anda secara eksplisit mengatur unit waktu
new Date("2016-02-16 00:00")
itu akan menggunakan set itu sebagaihours
danminutes
,Sebaliknya seperti yang dinyatakan di sini dalam 2 0.3.1.16
sumber
section 20.3.3.2
The String may be interpreted as a local time, a UTC time, or a time in some other time zone, depending on the contents of the String.
Di mana ia mengklaim bahwa itu pasti sama?