Dateオブジェクトの挙動の違い
JavaScriptのDateオブジェクトについて各ブラウザごとの挙動を調べてみました。
ちなみにすべてMac OS X v10.6.4におけるアプリケーションです。
以下のスクリプトを各ブラウザのJavaScriptコンソールで流してみます。
var dobs = [ "1975-10-27T00:00:00Z", "1975-10-27T00:00:00+09:00", "1975-10-27T00:00:00", "1975-10-27 00:00:00", "1975/10/27T00:00:00Z", "1975/10/27T00:00:00+09:00", "1975/10/27T00:00:00", "1975/10/27 00:00:00" ]; for (var idx in dobs) { if (typeof dobs[idx] === 'string') { var dob = new Date(dobs[idx]); console.log(dob.toString()); } }
結果は以下のとおり。
Browser Version (JavaScript Engine) | Firefox 3.6.11 (TraceMonkey) |
Safari 5.0.2 (JavaScriptCore) | Google Chrome 7.0.517.41 (V8) |
---|---|---|---|
"1975-10-27T00:00:00Z" | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Invalid Date | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"1975-10-27T00:00:00+09:00" | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) | Invalid Date | Invalid Date |
"1975-10-27T00:00:00" | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) | Invalid Date | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) |
"1975-10-27 00:00:00" | Invalid Date | Invalid Date | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) |
"1975/10/27T00:00:00Z" | Invalid Date | Invalid Date | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"1975/10/27T00:00:00+09:00" | Invalid Date | Invalid Date | Invalid Date |
"1975/10/27T00:00:00" | Invalid Date | Invalid Date | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) |
"1975/10/27 00:00:00" | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) | Mon Oct 27 1975 00:00:00 GMT+0900 (JST) |
与える値の観点から見ると「"YYYY/MM/DD hh:mm:ss"にしておくと無難」ということでしょうか。
Google Chromeがもっとも柔軟な対応を示してくれている反面Safariは頭固いですね。
そもそもJavaScriptは"new Date(dateString)"におけるdateStringについて
dateString 日時を表す文字列。この文字列は parse メソッドで認識される書式である必要があります。
Date - JavaScript | MDN
とされてるよう。
じゃあ"parse メソッドで認識される書式"とはなんぞやというと
与えられた日時を表す文字列に対し、parse は時刻の値を返します。このメソッドは IETF 標準日付構文 "Mon, 25 Dec 1995 13:30:00 GMT" を受け付けます。また、アメリカ大陸のタイムゾーンの省略形は理解しますが、一般的な利用では例えば "Mon, 25 Dec 1995 13:30:00 GMT+0430" (グリニッジ標準時より 4 時間 30 分東) というようにタイムゾーンのオフセットを使ってください。タイムゾーンを指定しなかった場合、地方時のタイムゾーンと仮定します。GMT と UTC は同じとみなされます。
Date.parse() - JavaScript | MDN
IETF 標準日付構文かぁー。あまり馴染みないですよね、とくに日本なら。
では方言としてのJavaScriptに対する標準語であるところのECMAScriptの仕様はどうなってるのか見てみます。現時点の最新は5th edition。
15.9.1.15 Date Time String Format
ECMAScript defines a string interchange format for date-times based upon a simplification of the ISO 8601 Extended Format. The format is as follows: YYYY-MM-DDTHH:mm:ss.sssZ
ISO 8601 拡張フォーマットをベースに定義されているようですね。この観点からするとGoogle Chromeが「"YYYY-MM-DDThh:mm:ss±hh:mm"」を解釈してくれないのは残念ですね。この形式を解釈してくれるのはFirefoxだけです。
このようにブラウザが積んでいるJavaScriptエンジンによって挙動が違うので気をつけねばですね。
以下にIETF 標準日付構文っぽいもので試した結果をおまけで記しておきました。
これについてはSafariが柔軟ですね。
Browser Version (JavaScript Engine) | Firefox 3.6.11 (TraceMonkey) |
Safari 5.0.2 (JavaScriptCore) | Google Chrome 7.0.517.41 (V8) |
---|---|---|---|
"Mon Oct 27 1975 09:00:00 GMT+0900", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon Oct 27 1975 09:00:00 GMT+0900 (JST)", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon Oct 27 1975 09:00:00 GMT+0900(JST)", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon Oct 27 1975 09:00:00GMT+0900(JST)", | Invalid Date | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Invalid Date |
"Mon Oct 27 1975 09:00:00", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon, Oct 27 1975 09:00:00 GMT+0900", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon, Oct 27 1975 09:00:00 GMT+0900 (JST)", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon, Oct 27 1975 09:00:00 GMT+0900(JST)", | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |
"Mon, Oct 27 1975 09:00:00GMT+0900(JST)", | Invalid Date | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Invalid Date |
"Mon, Oct 27 1975 09:00:00" | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) | Mon Oct 27 1975 09:00:00 GMT+0900 (JST) |