LoginSignup
1
1

More than 5 years have passed since last update.

Date で、IE8 が NaN を返すときにしたことメモ

Last updated at Posted at 2015-11-25

日付のフォーマットが、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 の仕様

ということらしいです。
以外と便利。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1