JavaScript | |

JavaScriptでISO8601形式の日付を扱う

ブラウザでもNode.jsでも同じです

  1. Date → ISO8601
  2. ISO8601 → Date

Date → ISO8601

Date 型の toISOString() を使う

UTC
const dt = new Date(Date.UTC(1999, 6, 31, 1, 1, 1, 1));  // タイムスタンプ = 933382861001
const isoStr = dt.toISOString();

console.log(isoStr);  // 1999-07-31T01:01:01.001Z
日本標準時
const dt = new Date(Date.UTC(1999, 6, 31, 1, 1, 1, 1));
dt.setHours(dt.getHours() + 9);
const isoStr = dt.toISOString().split('Z')[0] + '+09:00';

console.log(isoStr);  // 1999-07-31T10:01:01.001+09:00

ただし秒までしか要らない場合、自力でフォーマットする必要がある。

秒まで (UTC)
const toISOStringSec = (dt) => {
	const pad = (val, len) => {
		let p = '';
		for (let i = 0; i < len; ++i) {
			p += '0';
		}
		return (p + String(val)).slice(-1 * len);
	};
	const year = dt.getUTCFullYear();
	const month = dt.getUTCMonth() + 1;
	const days = dt.getUTCDate();
	const hours = dt.getUTCHours();
	const minutes = dt.getUTCMinutes();
	const seconds = dt.getUTCSeconds();
	return `${year}-${pad(month, 2)}-${pad(days, 2)}T${pad(hours, 2)}:${pad(minutes, 2)}:${pad(seconds, 2)}Z`;
};

const dt = new Date(Date.UTC(1999, 6, 31, 1, 1, 1, 1));  // タイムスタンプ = 933382861001
const isoStr = toISOStringSec(dt);

console.log(isoStr);  // 1999-07-31T01:01:01Z

ISO8601 → Date

Date.parse() を使う

UTCから
const ts = Date.parse('1999-07-31T01:01:01.001Z');
console.log(ts);  // 933382861001
const dt = new Date(ts);
日本標準時から
const ts = Date.parse('1999-07-31T10:01:01.001+09:00');
console.log(ts);  // 933382861001
const dt = new Date(ts);

こちらはミリ秒がついててもついてなくても変換できる

ミリ秒無し
const ts = Date.parse('1999-07-31T01:01:01Z');
console.log(ts);  // 933382861000
const dt = new Date(ts);