日付のフォーマットが、2015-11-10T12:37+09:00
のとき IE8で NaN
を返したので、そのときの対策をメモしておきます。
new Date("2015-11-10T12:37+09:00")
だと、NaN
になるので
2015,10,25,17,11,00
のフォーマットが良いらしい。
※ ライブラリを使えるならこのような方法はしなくても良いかもしれません。
現在の年月日時と、与えられた年月日時(2015-11-10T12:37+09:00)のフォーマットを比較するとき、IE8では単純にnew Date(2015-11-10T12:37+09:00).getTime() ができないので、
下記のようなフォーマット変換後に比較することにしました。
var date = "2015-11-25T17:11+09:00";
// var date = "2015-11-25T17:11Z";
var dateTimeArr = date.split('T');
var ymdArr = dateTimeArr[0].split('-');
var y = ymdArr[0];
var m = Number(ymdArr[1]) - 1;
var d = ymdArr[2];
var sepTime = dateTimeArr[1];
var resTime = sepTime.replace('Z', '').split(/\+|\-/)[0].split(/:/g);
var h = resTime[0];
var min = resTime[1];
var sec = '00';
console.log( new Date(y, m, d, h, min, sec).getTime() );
ここで気になったのが、タイムゾーンで、この時間を考慮すると、年や、月、日またぎ計算がとても複雑になります。でも比較なら
"2015-11-25T17:11+09:00"
日本はタイムゾーンが +09:00 ですが考慮する必要はなく、
new Date() // Wed Nov 25 17:11:00 UTC+0900 2015 <- IE8での出力結果
new Date("Wed Nov 25 17:11:00 UTC+0900 2015").getTime()
// 1448439060000
で得られる時間 と、+09:00 がない年月日時
new Date(2015,10,25,17,11,00).getTime() // 1448439060000
は同じミリ秒になります。
なので、現在の年月日時と、IE8用にフォーマットした年月日時 を比較できます。
if (new Date().getTime() > new Date(y, m, d, h, min, sec).getTime())
この方法でタイムゾーンを考慮しなくても、ミリ秒で比較できるのは、
日付文字列でタイムゾーン文字列がない場合、UTC として扱うという ECMAScript 5 の仕様
ということらしいです。
以外と便利。