Safari の JavaScript エンジンには、バグがあるようだ。
Safari では、時間帯が負の数のときに、
1970年以前の ISO 8601 (W3C DateTime) 表記の日時文字列を
Date に突っ込むと、時刻が1ミリ秒ズレてしまう。
new Date("1969-12-31T23:59:59.999+01:00").toJSON();
// OK! => "1969-12-31T22:59:59.999Z"
new Date("1969-12-31T23:59:59.999-01:00").toJSON();
// NG! => "1970-01-01T00:59:59.998Z"
本来なら 59.999 秒のところ、59.998 秒となる。
きっと、計算途中で小数点以下の丸め誤差が発生しているんだろう。
タイムゾーン | 1970年以降 | 1969年以前 |
---|---|---|
+00:00 以上(東半球) | ✅ OK | ✅ OK |
-00:00 未満(西半球) | ✅ OK | ❌ NG |
以下のコードでバグ有無を判別できる。→ gist
function checkDateBug() {
var date = +new Date("1969-12-31T23:59:59.999-01:00");
return date % 1000 !== 999;
}
JavaScript で 64bit の time_t
とナノ秒を扱うクラスを書いています。
https://www.npmjs.com/package/timestamp-nano