Javascript neden bu özdeş tarihleri farklı şekilde yorumluyor?
Burada olan şey:
> new Date('Apr 15 2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('04/15/2013');
Mon Apr 15 2013 00:00:00 GMT+0100 (GMT Daylight Time)
> new Date('2013-04-15');
Mon Apr 15 2013 01:00:00 GMT+0100 (GMT Daylight Time)
Açıkça, bir tanesi UTC zamanı olarak, diğer ikisi ise yerel zaman olarak yorumlanıyor. Ayrımın nedeni nedir?
Cevap #1
Spesifikasyondan:
Dize, içeriğine bağlı olarak yerel saat, UTC zamanı veya başka bir zaman dilimindeki zaman olarak yorumlanabilir. Fonksiyon, önce Dize'yi Tarih Saat Dizesi Formatı (15.9.1.15) bölümünde belirtilen kurallara göre çözümlemeyi dener. Dize bu formata uymuyorsa fonksiyon, herhangi bir uygulamaya özgü sezgilere veya uygulamaya özgü tarih formatlarına geri dönebilir.
Sağladığınız tüm formatlar arasında, yalnızca '2013-04-15' resmi olarak desteklenmektedir, bu nedenle diğerleri uygulamaya bağlı davranışa geri dönüyor gibi görünüyor.
Cevap #2
Üçüncü örneğiniz, aslında spesifikasyon tarafından açıklanan tek örnektir. Date yapıcısını tek bir argümanla çağırdığınızda şu olur (burada v, yapıcıya geçirilen stringdir):
vöğesini,parseyönteminde (15.9.4.2) olduğu gibi tam olarak aynı şekilde bir tarih olarak ayrıştırın; bu tarihin zaman değeriVolsun.
parse yöntemi, dizgiyi ayrıştırmayı deneyecektir (vurgu eklendi):
Dize, Dize'nin içeriğine bağlı olarak yerel bir zaman, UTC zamanı veya başka bir saat dilimindeki zaman olarak yorumlanabilir. Fonksiyon ilk olarak, Dize'nin biçimini Tarih Zaman Dizesi Biçimi (15.9.1.15) bölümünde belirtilen kurallara göre çözümlemeye çalışır.
String bu formata uymuyorsa, fonksiyon herhangi bir uygulamaya özgü kestirme yol veya uygulamaya özgü tarih formatlarına geri dönebilir.
Ve "Tarih Saat Dizisi Formatı" YYYY-MM-DDTHH:mm:ss.sssZ şeklindedir ve ayrıca üçüncü örneğinizde kullandığınız YYYY-MM-DD formunun daha kısa bir versiyonunu da tanımlar.
Diğer örnekler için, ayrıştırma başarısız olacak ve davranış uygulamaya bağlı olarak tanımlanacaktır.