JavaScriptで日付をISO文字列にする(toISOString)の基本と実践
ISO 8601形式はシステム間で扱いやすい標準日時フォーマットです。new Date().toISOString()は常にUTC基準の文字列(末尾がZ)を返します。表示やAPI送受信で迷いにくいのが利点です。
構文とポイント
const now = new Date();
const iso = now.toISOString(); // 例: "2025-12-05T00:31:00.000Z"
JavaScript- UTC固定: ローカルタイムゾーンではなく、常にUTCで出力します(末尾の「Z」はUTCを示す)。
- 書式: おおむね
YYYY-MM-DDTHH:mm:ss.sssZの形で、Date.parseとも互換の簡略ISO形式です。 - 返り値: 文字列。Date自体は不変で、整形済み文字列だけが取得できます。
すぐ使えるテンプレート集
現在日時をISO文字列で取得(API送信・ログ向け)
const isoNow = new Date().toISOString();
console.log(isoNow); // "2025-12-05T00:31:00.000Z"
JavaScript- 用途: タイムゾーン差のない時刻表現が必要なAPIやログ記録に最適。
ローカル表示とISOの違いを確認
const now = new Date();
console.log(now.toString()); // ローカルTZの表記
console.log(now.toISOString()); // UTCのISO表記(Z付き)
JavaScript- ポイント: ローカル表示は環境に依存、ISOは常にUTC。混同しないように使い分ける。
任意のDateをISO化(送信前整形)
const d = new Date("2025-12-05T09:31:00+09:00"); // JST指定
console.log(d.toISOString()); // "2025-12-05T00:31:00.000Z"(UTCへ換算)
JavaScript- ポイント: ローカル指定でも、出力はUTCへ変換されます。
よくある落とし穴と対策
- タイムゾーンが消える問題: ISOはUTCのため、ローカルTZ(例: +09:00)情報を保持したまま出したい場合は自前整形が必要。
- 対策: 年月日・時分秒を
getFullYear()などで取り出し、+09:00のようなオフセットを付けた文字列を組み立てる(例:YYYY-MM-DDTHH:mm:ss+09:00)。タグ付きテンプレートや関数化で再利用性を上げる。
- 対策: 年月日・時分秒を
- 無効なDate: 無効な日時に対しては例外(RangeError)が起きうるため、入力はバリデーションする。
- 表示と保存の混同: UI表示は
toLocaleString(ロケール・タイムゾーン指定)を使い、保存・送受信はtoISOStringに分けると安全。
実務で便利な関数
// 現在のISO文字列(UTC)
const nowISO = () => new Date().toISOString();
// 任意のDateを「ローカルTZ付きISO風」に整形(例:JST +09:00)
function toISOWithOffset(date, offsetMinutes) {
const pad = n => String(n).padStart(2, "0");
const y = date.getFullYear();
const m = pad(date.getMonth() + 1);
const d = pad(date.getDate());
const hh = pad(date.getHours());
const mm = pad(date.getMinutes());
const ss = pad(date.getSeconds());
const ms = String(date.getMilliseconds()).padStart(3, "0");
const sign = offsetMinutes >= 0 ? "+" : "-";
const abs = Math.abs(offsetMinutes);
const oh = pad(Math.floor(abs / 60));
const om = pad(abs % 60);
return `${y}-${m}-${d}T${hh}:${mm}:${ss}.${ms}${sign}${oh}:${om}`;
}
// 例:JSTは+540分(= 9*60)
console.log(toISOWithOffset(new Date(), 9 * 60)); // "YYYY-MM-DDTHH:mm:ss.sss+09:00"
JavaScript- 狙い:
toISOString()のUTC固定を補い、ローカルTZ付きフォーマットが必要なケースに対応。
練習問題(手を動かして覚える)
- 1. 現在のISO文字列を出力
console.log(new Date().toISOString());
JavaScript- 2. ローカル表示(日本語)とISOを比較
const now = new Date();
console.log(now.toLocaleString("ja-JP", { timeZone: "Asia/Tokyo" }));
console.log(now.toISOString());
JavaScript- 3. 任意日時をJST付き書式で整形
const d = new Date("2025-12-05T09:31:00+09:00");
console.log(toISOWithOffset(d, 9 * 60)); // "+09:00"付き
JavaScript直感的な指針
- 保存・API: UTCの
toISOString()で一貫性を担保。 - 人向け表示:
toLocaleStringでロケール・TZを指定。 - TZ付きISO風が必要: 自前整形でオフセットを明示。
