こうこく
作 ▸
改 ▸

JavaScriptのDateコンストラクタに渡す日時は地方時だった

コンストラクタに 1970年1月1日 を指定して生成した Date のUCTが 1969年12月31日 15:00 だった。

// 1970年1月1日のつもりで生成 (※月は0~11)
const dt = new Date(1970, 0, 1);

console.log(
	dt.getFullYear(), dt.getMonth(), dt.getDate(),
	dt.getHours(), dt.getMinutes(), dt.getSeconds(), dt.getMilliseconds()
);
// -> 1970 0 1 0 0 0 0

console.log(
	dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
	dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> 1969 11 31 15 0 0 0

console.log(dt.getTime());
// -> -32400000

マイナスのタイムスタンプなんてあるのか。

というか、初めて getUTCFullYear() とかの、UTC とつくメソッド群の存在を知った。今まで気にしたことなかったけど、getFullYear() とかはタイムゾーンが関係あったのか。

そもそも Date コンストラクタに年月日諸々をバラバラに渡して生成した場合、それらの日時は地方時として扱われていたらしい。

Date - JavaScript | MDN

補足: Date を複数の引数を伴ってコンストラクタとして呼び出された場所では、指定した引数は地方時 (local time) を表します。 UTC が望まれる場合は、同じ引数で new Date(Date.UTC(...)) を使用してください。

タイムゾーンを気にせずにバラバラの日時を使って Date 生成したかったら、先に Date.UTC() に渡してタイムスタンプを返してもらえばいいみたい。

const dt = new Date(Date.UTC(1970, 0, 1));

console.log(
	dt.getFullYear(), dt.getMonth(), dt.getDate(),
	dt.getHours(), dt.getMinutes(), dt.getSeconds(), dt.getMilliseconds()
);
// -> 1970 0 1

console.log(
	dt.getUTCFullYear(), dt.getUTCMonth(), dt.getUTCDate(),
	dt.getUTCHours(), dt.getUTCMinutes(), dt.getUTCSeconds(), dt.getUTCMilliseconds()
);
// -> 1970 0 1

console.log(dt.getTime());
// -> 0
この記事に何かあればこちらまで (非公開)