仕様なのか不明だが、よく DB にある yyyy-mm-dd 形式の日付をクライアントサイドの JavaScript でnew Date(string)すると時刻がなぜか9:00になってしまう。
日本のタイムゾーンが GMT +9 時間だからだとは思うが、なんとなくバグな気もする。
ブラウザごとに挙動も異なったので、まとめてみた。
| ソース | ブラウザ | 結果(Dateオブジェクト) |
|---|---|---|
| new Date(“2015-11-20”) | Chrome 46 | Fri Nov 20 2015 09:00:00 GMT+0900 (東京 (標準時)) |
| Firefox 42 | Date 2015-11-20T00:00:00.000Z | |
| IE 11 | Fri Nov 20 2015 09:00:00 GMT+0900 (東京 (標準時)) | |
| new Date(“2015-11-20 00:00:00”) | Chrome 46 | Fri Nov 20 2015 00:00:00 GMT+0900 (東京 (標準時)) |
| Firefox 42 | Invalid Date | |
| IE 11 | Invalid Date | |
| new Date(“2015/11/20”) | Chrome 46 | Fri Nov 20 2015 00:00:00 GMT+0900 (東京 (標準時)) |
| Firefox 42 | Date 2015-11-19T15:00:00.000Z | |
| IE 11 | Fri Nov 20 2015 00:00:00 GMT+0900 (東京 (標準時)) | |
| new Date(“2015/11/20 00:00:00”) | Chrome 46 | Fri Nov 20 2015 00:00:00 GMT+0900 (東京 (標準時)) |
| Firefox 42 | Date 2015-11-19T15:00:00.000Z | |
| IE 11 | Fri Nov 20 2015 00:00:00 GMT+0900 (東京 (標準時)) |
太字が正しい変換結果。Firefoxでは19日の15時なっているがこれはタイムゾーンがZulu time(標準時)になっているからで、date.getHours()などとするとちゃんと0が得られる。
結果として、たいていのブラウザで正しく動作させるためには"2015/11/20"形式は"2015/11/20 00:00:00"形式がよいことがわかった。
日付文字列が DB 形式の場合は変換前にハイフンをスラッシュに置換してやるのがよさそうだ。
dateString = dateString.replace(/\-/, "/");