Tanggal baru () bekerja secara berbeda di Chrome dan Firefox

94

Saya ingin mengubah string tanggal menjadi Datedengan javascript, gunakan kode ini:

var date = new Date('2013-02-27T17:00:00');
alert(date);

'2013-02-27T17:00:00' adalah waktu UTC di objek JSON dari server.

Namun hasil kode di atas berbeda antara Firefox dan Chrome:

Firefox kembali:

Wed Feb 27 2013 17:00:00 GMT+0700 (SE Asia Standard Time)

Chrome kembali:

Thu Feb 28 2013 00:00:00 GMT+0700 (SE Asia Standard Time) 

Ini berbeda 1 hari, hasil yang benar yang saya harapkan adalah hasil dari Chrome.

Kode demo: http://jsfiddle.net/xHtqa/2/

Bagaimana cara memperbaiki masalah ini untuk mendapatkan hasil yang sama dari keduanya?

cuongle
sumber
2
Apa itu di komputer yang sama?
Aaron Digulla
4
@Sandeep poin utamanya adalah bahwa Chrome menambahkan offset zona waktu sementara Firefox tidak
default lokal
3
@CuongLe Pernahkah Anda melihat pertanyaan ini: stackoverflow.com/questions/9062863/…
lokal default
1
Ini Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}untuk saya di keduanya (Linux).
marekful
1
Sudut Nitpicker: «waktu UTC dalam format JSON» - format JSON? Tepatnya, keluhan umum tentang JSON adalah bahwa JSON tidak menentukan format tanggal sama sekali.
Álvaro González

Jawaban:

66

Format yang benar untuk UTC adalah 2013-02-27T17:00:00Z(Z untuk Waktu Zulu). Tambahkan Zjika tidak ada untuk mendapatkan string tanggal waktu UTC yang benar.

Petr Abdulin
sumber
2
Terima kasih. Ini bekerja. Tapi ada log yang mengatakan, itu akan dihentikan di masa depan !!!. Ada Ide, tolong?
Débora
1
terima kasih banyak, saya telah duduk dengan masalah ini selama dua hari, tetapi posting ini menyelesaikan semuanya.
Piyal George
30

Ya, sayangnya algoritme penguraian tanggal bergantung pada implementasi. Dari spesifikasiDate.parse (yang digunakan oleh new Date):

String dapat diartikan sebagai waktu lokal, waktu UTC, atau waktu di beberapa zona waktu lain, bergantung pada konten String. Fungsi ini pertama kali mencoba mengurai format String sesuai dengan aturan yang disebut dalam Format String Waktu Tanggal ( 15.9.1.15 ). Jika String tidak sesuai dengan format tersebut, fungsi tersebut dapat kembali ke heuristik khusus implementasi atau format tanggal khusus implementasi.

Untuk membuat Datekonstruktor tidak (mungkin) menggunakan zona waktu lokal, gunakan string datetime dengan informasi zona waktu, mis "2013-02-27T17:00:00Z". Namun, sulit untuk menemukan format yang dapat diurai oleh setiap browser - format ISO tidak dikenali oleh IE <8 (lihat JavaScript: Browser mana yang mendukung penguraian ISO-8601 Date String dengan Date.parse ). Lebih baik, gunakan stempel waktu unix, yaitu milidetik sejak unix epoch , atau gunakan ekspresi reguler untuk memecah string di bagian-bagiannya dan kemudian memasukkannya ke dalamnya Date.UTC.

Bergi
sumber
2
Tetapi spesifikasi (15.9.1.15) sebenarnya mengatakan: "Nilai offset zona waktu yang tidak ada adalah" Z "" - jadi TIDAK harus bergantung pada implementasi
sinelaw
12
Oke, koreksi. Sepertinya ada kesalahan dalam spesifikasi ES5.1 - maksudnya adalah untuk mencocokkan ISO-8601 di mana Z yang hilang berarti waktu lokal (jadi Chrome cocok dengan ES5.1, Firefox & IE cocok dengan ISO-8601)
sinelaw
@ sinelaw: Terima kasih telah menyelidiki lebih lanjut hal itu. Namun, terlepas dari apa yang dinyatakan spesifikasinya, browser [lama] masih melakukannya secara berbeda :-)
Bergi
2
Anehnya, menggunakan Date.Parse vs. Tanggal baru memperbaiki masalah yang saya alami di mana Chrome akan mengonversi tanggal ke zona waktu lokal alih-alih memperlakukannya seperti yang sudah ada di zona waktu lokal.
KingOfHypocrites
1
@ KingOfHypocrites — itu agak aneh karena memanggil konstruktor Date dengan string seharusnya sama dengan menggunakan Date.parse .
RobG
4

Saya menemukan satu hal di sini. Tampaknya Konsol Inspektur Firefox asli mungkin memiliki bug: Jika saya menjalankan "new Date ()" di Inspektur asli, itu menunjukkan tanggal dengan zona waktu yang salah, lokal GMT, tetapi menjalankan perintah yang sama di Konsol Ekstensi Firebug, tanggal ditampilkan menggunakan zona waktu yang benar (GMT-3: 00).

Sergio Abreu
sumber
-2

Coba gunakan moment.js. Ini berjalan sangat baik dan dengan cara yang sama dengan semua browser. hadir dengan banyak opsi pemformatan. gunakan momen ('tanggal'). format ("") bukan Tanggal Baru ('tanggal')

MSIslam
sumber
-2

Perhatikan bahwa FireFox tidak mengembalikan hasil yang sama seperti Chrome. Sepertinya format yang Anda gunakan di kendo.toString untuk tanggal membuat perbedaan.

Hasil konsol terakhir adalah yang saya butuhkan:

masukkan deskripsi gambar di sini

MJ Storm
sumber