Kısa Cevap
Javascript'in sunduğu “evrensel” bir belge yoktur; javascript olan her tarayıcı gerçekten bir uygulamadır. Ancak, çoğu modern tarayıcının takip etme eğilimi olan bir standart vardır ve bu EMCAScript standardıdır; ECMAScript standart dizeleri, ISO 8601 tanımının en azından değiştirilmiş bir uygulamasını alacaktır.
Buna ek olarak, IETF tarafından tarayıcıların da takip etme eğiliminde olduğu ikinci bir standart vardır, bu da RFC 2822'de yapılan zaman damgalarının tanımıdır. Gerçek belgeler, alttaki referanslar listesinde bulunabilir.
Bundan temel işlevsellik bekleyebilirsiniz, ancak “olması gereken” doğal olarak “ne” değildir. Bununla birlikte, prosedürel olarak biraz derinlemesine gideceğim, çünkü sadece üç kişi aslında soruyu yanıtladı (Scott, goofballLogic ve peller), ki bana göre, çoğu insanın aslında ne zaman olduğunun farkında olmadığını gösteriyor bir Date nesnesi yarat.
Uzun Cevap
Date () nesnesi tarafından desteklenen format belirteçlerini listeleyen belgeler nerede?
Soruyu cevaplamak veya genellikle bu sorunun cevabını aramak için, javascript'in yeni bir dil olmadığını bilmeniz gerekir; aslında ECMAScript'in bir uygulamasıdır ve ECMAScript standartlarını takip eder (ancak, javascript aslında bu standartlardan da önce gelir; EMCAScript standartları LiveScript / JavaScript'in erken uygulanmasından oluşur). Mevcut ECMAScript standardı 5.1 (2011); sorunun asıl sorulduğu sırada (Haziran '09), standart 3'dü (4 terk edildi), ancak 5 2009 sonunda görevden kısa bir süre sonra serbest bırakıldı. Bu bir sorunun ana hatlarını çizmeli; bir javascript uygulamasının hangi standardı takip edebileceği, gerçekte mevcut olanı yansıtmayabilir, çünkü a) belirli bir standardın uygulamasıdır, b) bir standardın tüm uygulamaları püriten değildir,
Temel olarak, javascript ile uğraşırken, bir uygulamanın (javascript'in kendisi) bir türevi (tarayıcıya özgü javascript) ile uğraşıyorsunuz. Google'ın V8'i, örneğin, ECMAScript 5.0'ı uygular, ancak Internet Explorer'ın JScript'i herhangi bir ECMAScript standardına uymaya çalışmaz, ancak Internet Explorer 9 ECMAScript 5.0'a uygundur.
Yeni Date () öğesine tek bir argüman iletildiğinde, bu işlev prototipini verir:
new Date(value)
Yeni Date () öğesine iki veya daha fazla argüman iletildiğinde, bu işlev prototipini yayınlar:
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
Bu işlevlerin her ikisi de tanıdık gelmelidir, ancak bu hemen sorunuza cevap vermez ve kabul edilebilir bir “tarih formatı” olarak neyin nicelendirildiğini daha fazla açıklama gerektirir. (Kelimesini kullanıyorum o notu siz) yeni tarihi (bir dize geçtiğinizde, bu prototip arayacak prototipi ; versiyonları bireysel fonksiyonları olabilir veya tek bir işlevde bir koşullu ifadenin parçası olabilir gevşek) için “value” parametresi için bağımsız değişken olarak dizenizle yeni Date (değer) . Bu işlev önce bir sayı mı yoksa dize mi olduğunu kontrol edecektir. Bu işlevin belgelerini burada bulabilirsiniz:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
Bundan, yeni Date (değer) için dize biçimlendirmesine izin vermek için Date.parse (string) yöntemine bakmamız gerektiğini çıkarabiliriz. Bu yöntemin belgelerini burada bulabilirsiniz:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
Ayrıca, tarihlerin burada belirtildiği gibi değiştirilmiş bir ISO 8601 Genişletilmiş Biçiminde olması beklenebilir:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Bununla birlikte, javascript'in Date nesnesinin (bu sorunun ilk etapta varlığıyla zorunlu kılınan) diğer formatları kabul ettiğini deneyimlerden anlayabiliriz ve ECMAScript uygulamaya özel formatlara izin verdiğinden bu sorun olmaz. Bununla birlikte, bu hala mevcut biçimlerde hangi belgelerin mevcut olduğu veya hangi biçimlere gerçekten izin verildiği sorusuna cevap vermez. Google'ın javascript uygulamasına (V8) bakacağız; Lütfen bunun "en iyi" javascript motoru olduğunu önermiyorum (biri "en iyi" veya hatta "iyi" olarak nasıl tanımlanabilir) ve V8'de izin verilen biçimlerin bugün mevcut olan tüm biçimleri temsil ettiğini varsayamam, ancak bunun adil olduğunu düşünüyorum modern beklentileri takip ettiklerini varsaymak.
Google'ın V8, date.js, DateConstructor
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
DateConstructor işlevine baktığımızda, DateParse işlevini bulmamız gerektiğini belirleyebiliriz; ancak, “yıl” ın gerçek yıl olmadığını ve yalnızca “yıl” parametresine referans olduğunu unutmayın.
Google'ın V8, date.js, DateParse
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
Bu, aslında bir C ++ işlevi için çalışma zamanı işlev başvurusu olan% DateParseString öğesini çağırır. Aşağıdaki kodu ifade eder:
Google'ın V8, runtime.cc,% DateParseString
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
Bu işlevde ilgilendiğimiz işlev çağrısı DateParser :: Parse (); bu fonksiyon çağrılarını çevreleyen mantığı yok sayın, bunlar sadece kodlama türüne (ASCII ve UC16) uygunluk kontrolleridir. DateParser :: Ayrıştırma burada tanımlanmıştır:
Google'ın V8, dateparser-inl.h, DateParser :: Ayrıştırma
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
Bu, hangi formatları kabul ettiğini gerçekten tanımlayan işlevdir. Esasen, EMCAScript 5.0 ISO 8601 standardını kontrol eder ve standartlarla uyumlu değilse, tarihi eski formatlara göre oluşturmaya çalışır. Yorumlara dayanan birkaç önemli nokta:
- Ayrıştırıcı tarafından bilinmeyen ilk sayıdan önceki sözcükler yoksayılır.
- Parantez içine alınmış metin yoksayılır.
- İmzasız numaralar ve ardından “:”, “zaman bileşeni” olarak yorumlanır.
- İmzasız numaralar ve ardından “.” "zaman bileşeni" olarak yorumlanır ve bunu milisaniye takip etmelidir.
- İmzalı numaralar ve ardından saat veya saat dakikası (örn. +5: 15 veya +0515) saat dilimi olarak yorumlanır.
- Saati ve dakikayı bildirirken "ss: dd" veya "ssd" kullanabilirsiniz.
- Bir saat dilimini gösteren kelimeler bir saat dilimi olarak yorumlanır.
- Diğer tüm sayılar “tarih bileşenleri” olarak yorumlanır.
- Bir ayın ilk üç basamağıyla başlayan tüm kelimeler ay olarak yorumlanır.
- Dakikaları ve saatleri birlikte şu iki formattan birinde tanımlayabilirsiniz: “ss: dd” veya “ssmm”.
- Bir sayı işlendikten sonra “+”, “-“ ve eşleşmeyen “)” gibi sembollere izin verilmez.
- Birden çok formatla eşleşen öğeler (örn. 1970-01-01) standart uyumlu EMCAScript 5.0 ISO 8601 dizesi olarak işlenir.
Bu nedenle, bir Date nesnesine bir dize geçirme konusunda ne bekleyebileceğiniz konusunda temel bir fikir vermek için bu yeterli olmalıdır. Mozilla'nın Mozilla Geliştirici Ağı'nda (IETF RFC 2822 zaman damgalarıyla uyumlu) işaret ettiği aşağıdaki spesifikasyona bakarak bunu daha da genişletebilirsiniz:
http://tools.ietf.org/html/rfc2822#page-14
Microsoft Developer Network ek olarak Date nesnesi için ek bir standarttan bahsetmektedir: ECMA-402, ECMAScript Uluslararasılaşma API Spesifikasyonu, ECMAScript 5.1 standardını (ve gelecekteki). Burada bulunabilir:
http://www.ecma-international.org/ecma-402/1.0/
Her durumda, bu, evrensel olarak tüm javascript uygulamalarını temsil eden bir "belge" olmadığını vurgulamaya yardımcı olmalıdır, ancak bir Date nesnesi için hangi dizelerin kabul edilebilir olduğuna dair makul bir anlam elde etmek için hala yeterli belge vardır. Düşündüğünüzde oldukça yüklü soru, değil mi? : P
Referanslar
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
http://tools.ietf.org/html/rfc2822#page-14
http://www.ecma-international.org/ecma-402/1.0/
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
kaynaklar
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date
http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94).aspx