Jawaban Singkat
Tidak ada dokumentasi "universal" yang dapat dilayani oleh javascript; setiap browser yang memiliki javascript benar-benar sebuah implementasi. Namun, ada standar yang cenderung diikuti oleh kebanyakan browser modern, dan itulah standar EMCAScript; string standar ECMAScript akan mengambil, minimal, implementasi modifikasi dari definisi ISO 8601.
Selain itu, ada standar kedua yang ditetapkan oleh IETF yang cenderung diikuti peramban, yang merupakan definisi untuk cap waktu yang dibuat dalam RFC 2822. Dokumentasi aktual dapat ditemukan dalam daftar referensi di bagian bawah.
Dari sini Anda dapat mengharapkan fungsionalitas dasar, tetapi apa yang "seharusnya" tidak secara inheren adalah "apa". Aku akan pergi sedikit mendalam dengan ini secara prosedural, karena tampaknya hanya tiga orang yang benar-benar menjawab pertanyaan (Scott, goofballLogic, dan peller yaitu) yang, bagi saya, menyarankan kebanyakan orang tidak menyadari apa yang sebenarnya terjadi ketika Anda buat objek Date.
Jawaban Panjang
Di mana dokumentasi yang mencantumkan penspesifikasi format yang didukung oleh objek Date ()?
Untuk menjawab pertanyaan, atau biasanya mencari jawaban untuk pertanyaan ini, Anda perlu tahu bahwa javascript bukan bahasa novel; ini sebenarnya merupakan implementasi dari ECMAScript, dan mengikuti standar ECMAScript (tapi perlu diketahui, javascript juga sebenarnya sudah meng-pre-date standar-standar tersebut; standar EMCAScript dibangun dari implementasi awal LiveScript / JavaScript). Standar ECMAScript saat ini adalah 5.1 (2011); pada saat pertanyaan awalnya diajukan (Juni '09), standarnya adalah 3 (4 ditinggalkan), tetapi 5 dirilis tidak lama setelah posting pada akhir 2009. Ini harus menguraikan satu masalah; standar apa yang bisa diikuti oleh implementasi javascript, mungkin tidak mencerminkan apa yang sebenarnya ada, karena a) ini merupakan implementasi dari standar yang diberikan, b) tidak semua implementasi standar adalah puritan,
Pada dasarnya, ketika berhadapan dengan javascript, Anda berhadapan dengan turunan (javascript khusus untuk browser) dari suatu implementasi (javascript itu sendiri). Google V8, misalnya, mengimplementasikan ECMAScript 5.0, tetapi Internet Explorer JScript tidak berusaha untuk memenuhi standar ECMAScript, namun Internet Explorer 9 sesuai dengan ECMAScript 5.0.
Ketika satu argumen dilewatkan ke Date () baru, ia melemparkan prototipe fungsi ini:
new Date(value)
Ketika dua atau lebih argumen diteruskan ke Date () baru, ia melemparkan prototipe fungsi ini:
new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )
Kedua fungsi tersebut seharusnya terlihat familier, tetapi ini tidak segera menjawab pertanyaan Anda dan apa yang dikuantifikasi sebagai "format tanggal" yang dapat diterima memerlukan penjelasan lebih lanjut. Ketika Anda meneruskan string ke Date () baru, itu akan memanggil prototipe (perhatikan bahwa saya menggunakan kata prototipe secara longgar; versi mungkin fungsi individu, atau mungkin menjadi bagian dari pernyataan kondisional dalam fungsi tunggal) untuk Tanggal baru (nilai) dengan string Anda sebagai argumen untuk parameter "nilai". Fungsi ini pertama-tama akan memeriksa apakah itu angka atau string. Dokumentasi untuk fungsi ini dapat ditemukan di sini:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2
Dari ini, kita dapat menyimpulkan bahwa untuk mendapatkan pemformatan string diizinkan untuk Date (nilai) baru, kita harus melihat metode Date.parse (string). Dokumentasi untuk metode ini dapat ditemukan di sini:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2
Dan kita dapat lebih jauh menyimpulkan bahwa tanggal diharapkan dalam format diperpanjang ISO 8601 yang dimodifikasi, seperti yang ditentukan di sini:
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
Namun, kami dapat mengenali dari pengalaman bahwa objek Date javascript menerima format lain (diberlakukan oleh keberadaan pertanyaan ini di tempat pertama), dan ini tidak apa-apa karena ECMAScript memungkinkan untuk mengimplementasikan format spesifik. Namun, itu masih belum menjawab pertanyaan tentang dokumentasi apa yang tersedia pada format yang tersedia, atau format apa yang sebenarnya diperbolehkan. Kita akan melihat implementasi javascript Google, V8; harap dicatat saya tidak menyarankan ini adalah mesin javascript "terbaik" (bagaimana seseorang dapat mendefinisikan "terbaik" atau bahkan "baik") dan orang tidak dapat berasumsi bahwa format yang diperbolehkan dalam V8 mewakili semua format yang tersedia saat ini, tapi saya pikir ini adil untuk menganggap mereka mengikuti harapan modern.
V8 Google, date.js, DateConstructor
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141
Melihat fungsi DateConstructor, kita dapat menyimpulkan bahwa kita perlu menemukan fungsi DateParse; Namun, perhatikan bahwa "tahun" bukan tahun yang sebenarnya dan hanya referensi ke parameter "tahun".
V8 Google, date.js, DateParse
https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270
Ini memanggil% DateParseString, yang sebenarnya merupakan referensi fungsi run-time untuk fungsi C ++. Itu mengacu pada kode berikut:
V8 Google, runtime.cc,% DateParseString
https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559
Panggilan fungsi yang kami perhatikan dalam fungsi ini adalah untuk DateParser :: Parse (); abaikan logika yang mengelilingi panggilan fungsi tersebut, ini hanya pemeriksaan untuk menyesuaikan dengan tipe penyandian (ASCII dan UC16). DateParser :: Parse didefinisikan di sini:
V8 Google, dateparser-inl.h, DateParser :: Parse
https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36
Ini adalah fungsi yang sebenarnya mendefinisikan format apa yang diterimanya. Pada dasarnya, ia memeriksa standar EMCAScript 5.0 ISO 8601 dan jika tidak memenuhi standar, maka ia akan berusaha untuk membangun tanggal berdasarkan format lama. Beberapa poin kunci berdasarkan komentar:
- Kata-kata sebelum nomor pertama yang tidak diketahui oleh parser diabaikan.
- Teks yang dikurung diabaikan.
- Angka yang tidak ditandai diikuti oleh ":" ditafsirkan sebagai "komponen waktu".
- Nomor yang tidak ditandai diikuti oleh "." ditafsirkan sebagai "komponen waktu", dan harus diikuti oleh milidetik.
- Angka yang ditandatangani diikuti oleh jam atau menit jam (misalnya +5: 15 atau +515) ditafsirkan sebagai zona waktu.
- Saat mendeklarasikan jam dan menit, Anda dapat menggunakan "hh: mm" atau "hhmm".
- Kata-kata yang menunjukkan zona waktu ditafsirkan sebagai zona waktu.
- Semua angka lainnya ditafsirkan sebagai "komponen tanggal".
- Semua kata yang dimulai dengan tiga digit pertama dalam sebulan ditafsirkan sebagai bulan.
- Anda dapat menentukan menit dan jam bersama dalam salah satu dari dua format: "hh: mm" atau "hhmm".
- Simbol seperti "+", "-" dan ")" yang tidak cocok tidak diizinkan setelah nomor telah diproses.
- Item yang cocok dengan berbagai format (mis. 1970-01-01) diproses sebagai string EMCAScript 5.0 ISO 8601 yang sesuai standar.
Jadi ini harus cukup untuk memberi Anda ide dasar tentang apa yang diharapkan ketika harus memasukkan string ke objek Date. Anda dapat memperluas ini dengan melihat spesifikasi berikut yang ditunjuk Mozilla di Jaringan Pengembang Mozilla (sesuai dengan cap waktu IETF RFC 2822):
http://tools.ietf.org/html/rfc2822# halaman 14
Jaringan Pengembang Microsoft juga menyebutkan standar tambahan untuk objek Tanggal: ECMA-402, Spesifikasi API Internasionalisasi Script ECMAS, yang melengkapi standar ECMAScript 5.1 (dan yang akan datang). Itu dapat ditemukan di sini:
http://www.ecma-international.org/ecma-402/1.0/
Bagaimanapun, ini harus membantu menyoroti bahwa tidak ada "dokumentasi" yang secara universal mewakili semua implementasi javascript, tetapi masih ada cukup dokumentasi yang tersedia untuk membuat akal yang masuk akal dari string apa yang dapat diterima untuk objek Date. Pertanyaan yang cukup dimuat ketika Anda memikirkannya, ya? : P
Referensi
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# halaman 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
Sumber daya
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