new Date (), Chrome ve Firefox'ta farklı çalışır


94

Tarih dizesini Datejavascript'e dönüştürmek istiyorum , şu kodu kullanın:

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

'2013-02-27T17:00:00' sunucudan JSON nesnesinde UTC zamanıdır.

Ancak yukarıdaki kodun sonucu Firefox ve Chrome arasında farklıdır:

Firefox şunu döndürür:

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

Chrome şunu döndürür:

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

1 gün farklı, beklediğim doğru sonuç Chrome'un sonucudur.

Demo kodu: http://jsfiddle.net/xHtqa/2/

Her ikisinden de aynı sonucu almak için bu sorunu nasıl çözebilirim?


2
Bu aynı bilgisayarda mı?
Aaron Digulla

4
@Sandeep ana nokta, Chrome'un saat dilimi farkı eklerken Firefox'un eklememesi
varsayılan yerel ayar

3
@CuongLe Bu soruyu gördünüz mü: stackoverflow.com/questions/9062863/…
varsayılan yerel ayar

1
Her Date {Wed Feb 27 2013 17:00:00 GMT+0000 (GMT)}ikisinde de benim için (Linux).
marekful

1
Nitpicker köşesi: «JSON biçiminde UTC saati» - JSON biçiminde? Kesin olarak, JSON ile ilgili yaygın bir şikayet, herhangi bir tarih formatını tanımlamamasıdır.
Álvaro González

Yanıtlar:


67

UTC için doğru format 2013-02-27T17:00:00Z(Z, Zulu Saati içindir) olacaktır. ZDoğru UTC tarih saat dizesini almak için mevcut değilse ekleyin .


2
Teşekkürler. Bu çalışıyor. Ancak, gelecekte kullanımdan kaldırılacak bir günlük var !!!. Herhangi bir fikir lütfen?
Débora

1
çok teşekkürler, iki gündür bu konuyla oturuyorum ama bu yazı her şeyi çözdü.
Piyal George

30

Evet, maalesef tarih ayrıştırma algoritmaları uygulamaya bağlıdır. Kaynaktan spesifikasyonunaDate.parse (ki kullanılır new Date):

Dize, Dize içeriğine bağlı olarak bir yerel saat, bir UTC saati veya başka bir zaman diliminde bir saat olarak yorumlanabilir. İşlev ilk olarak Dize biçimini Tarih Saat Dize Biçimi'nde ( 15.9.1.15 ) belirtilen kurallara göre ayrıştırmaya çalışır . Dize bu biçime uymuyorsa, işlev herhangi bir uygulamaya özgü buluşsal yöntemlere veya uygulamaya özgü tarih biçimlerine geri dönebilir.

Yapmak için Dateyapıcı değil (belki) yerel saat dilimini kullanır, zaman dilimi bilgisi olan, örneğin bir datetime dize kullanabilirsiniz "2013-02-27T17:00:00Z". Ancak, her tarayıcı tarafından güvenilir bir şekilde ayrıştırılan bir format bulmak zordur - ISO formatı IE <8 tarafından tanınmaz (bkz. JavaScript: Hangi tarayıcılar ISO-8601 Tarih Dizesinin Date.parse ile ayrıştırılmasını destekler ). Daha iyisi, bir unix zaman damgası kullanın, yani unix döneminden beri geçen milisaniyeler veya dizgiyi parçalarına ayırmak ve sonra bunları içine beslemek için normal bir ifade kullanın Date.UTC.


2
Ancak spesifikasyon (15.9.1.15) aslında şöyle diyor: "Eksik bir saat dilimi uzaklığının değeri" Z "" - bu nedenle uygulamaya bağlı
OLMAMALIDIR

12
Tamam, düzeltme. ES5.1 spesifikasyonunda bir hata gibi görünüyor - amaç, eksik Z'nin yerel saat anlamına geldiği ISO-8601 ile eşleşmekti (bu nedenle Chrome, ES5.1, Firefox ve IE, ISO-8601 ile eşleşir)
sinelaw

@sinelaw: Bu noktayı daha fazla araştırdığınız için teşekkürler. Bununla birlikte, spesifikasyonda belirtilenden bağımsız olarak, [eski] tarayıcılar bunu hala farklı şekilde yapıyor :-)
Bergi

2
Garip bir şekilde Date.Parse ve new Date'i kullanmak, Chrome'un tarihi yerel saat dilimindeymiş gibi ele almak yerine, tarihi yerel saat dilimine dönüştürdüğü sorunu çözdü.
KingOfHypocrites

1
@ KingOfHypocrites — Bu biraz tuhaf, çünkü bir dizeyle Date kurucusunu çağırmanın Date.parse kullanmakla aynı olması gerekiyor .
RobG

4

Burada bir şey buldum. Görünüşe göre yerel Firefox Inspector Console'da bir hata olabilir: Yerel Inspector'da "new Date ()" çalıştırırsam, yanlış saat dilimine, GMT yerel ayarına sahip bir tarih gösterir, ancak aynı komutu Firebug Extension Console'da çalıştırır, tarih gösterilen doğru saat dilimimi kullanıyor (GMT-3: 00).


-2

FireFox'un Chrome ile aynı sonucu döndürmediğini fark ettim. Görünüşe göre kendo.toString for date'da kullandığınız format bir fark yaratıyor.

Son konsol sonucu ihtiyacım olan şeydi:

görüntü açıklamasını buraya girin


-3

Moment.js kullanmayı deneyin. Tüm tarayıcılarda çok iyi ve benzer şekilde gidiyor. birçok biçimlendirme seçeneğiyle birlikte gelir. Yeni Tarih ('tarih') yerine an ('tarih'). format ("") kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.