こうこく
作 ▸
改 ▸

JavaScriptの負のタイムスタンプ?

  • Dateは -271821年4月20日 まで対応
  • それを下回ると Invalid Date (Error は吐かない)

偶然、負の数のタイムスタンプ見てびびったんだけど、そもそも Date は1970年1月1日より過去にも普通に対応してた。

Date - JavaScript | MDN

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日より過去をシステムで扱うときは気を付けること。

この記事に何かあればこちらまで (非公開)