JavaScriptの負のタイムスタンプ?
- Dateは -271821年4月20日 まで対応
- それを下回ると
Invalid Date
(Error
は吐かない)
偶然、負の数のタイムスタンプ見てびびったんだけど、そもそも Date
は1970年1月1日より過去にも普通に対応してた。
JavaScript の日時は、UTC の 1970 年 1 月 1 日 0 時を基準とするミリ秒単位の値です。1 日は 86,400,000 ミリ秒です。JavaScript の Date オブジェクトの範囲は、UTC の 1970 年 1 月 1 日に対して -100,000,000 日から 100,000,000 日です。
試しにタイムスタンプとしてマイナス1秒ミリ秒を指定して Date
生成してみる。
const dt = new Date(-1);
console.log(
dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> 1969 11 31 23 59 59 999
西暦0年1月1日を狙ってみる……。
const dt = new Date(-719528 * 24 * 60 * 60 * 1000);
console.log(
dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> 0 0 1 0 0 0 0
-100,000,000日……は、-271821年4月20日。
const dt = new Date(-100000000 * 24 * 60 * 60 * 1000);
console.log(
dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> -271821 3 20 0 0 0 0
-100,000,000日を下回ると Invalid Date
になる。特にこの場で Error
を吐いたりしない。
const dt = new Date(-100000000 * 24 * 60 * 60 * 1000 - 1);
console.log(dt);
// -> Invalid Date
console.log(
dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> NaN NaN NaN NaN NaN NaN NaN
-271821年4月20日より過去をシステムで扱うときは気を付けること。