JavaScriptで日付文字列を扱う場面はよくあります。たとえば「2024-04-01」という文字列を比較・演算したい場合や、APIから受け取った日付文字列を表示用にフォーマットしたい場合です。日付の表示・整形そのものは日付のフォーマットを変換する方法も参考になります。
この記事で学べること:文字列→Date変換の3つの方法・タイムゾーン問題の回避・Invalid Dateの判定・ブラウザ差異への対処
new Date() に文字列を渡す(基本)
もっとも簡単な方法は new Date("日付文字列") です。
new Date() で変換
// ISO 8601形式(推奨)
const d1 = new Date("2024-04-01");
console.log(d1); // Mon Apr 01 2024 09:00:00 GMT+0900(JST)
// 日時も指定できる
const d2 = new Date("2024-04-01T15:30:00");
console.log(d2.getFullYear()); // 2024
console.log(d2.getMonth()); // 3 ※0始まりなので4月=3
console.log(d2.getDate()); // 1
タイムゾーンの罠:
new Date("2024-04-01") のようにISO日付のみを渡すとUTCとして解釈されます。JST(UTC+9)環境では console.log で前日相当の表示になることがあります。時刻まで含めた "2024-04-01T00:00:00"(ローカル時刻扱い)や "2024-04-01T00:00:00+09:00"(タイムゾーン明示)を使うと安全です。Date.parse() でタイムスタンプを取得する
Date.parse() は日付文字列をミリ秒(Unixタイムスタンプ)に変換します。大小比較や差分計算に便利です。
Date.parse() で変換
const ts = Date.parse("2024-04-01T00:00:00+09:00");
console.log(ts); // 1711897200000(ミリ秒)
const d = new Date(ts);
console.log(d.toISOString()); // "2024-03-31T15:00:00.000Z"(UTC)
// 解析失敗時は NaN
const bad = Date.parse("invalid-date");
console.log(isNaN(bad)); // true → エラーチェックが必要
使いどころ:2つの日付の差分(日数)は、Dateオブジェクト同士を引き算してミリ秒差を求めます。
(d2 - d1) / (1000 * 60 * 60 * 24) で日数差になります(詳しくは日数の差を計算する方法)。Invalid Date を確実に判定する
変換に失敗すると new Date() は Invalid Date を返します。これを確実に判定するには isNaN(date.getTime()) を使います(date === "Invalid Date" のような比較はできません)。
Invalid Date の判定
function toDate(str) {
const d = new Date(str);
return isNaN(d.getTime()) ? null : d; // 無効なら null を返す
}
console.log(toDate("2024-04-01")); // 正常な Date
console.log(toDate("not a date")); // null
console.log(toDate("")); // null
入力が有効な日付文字列かを事前にチェックしたい場合は日付のチェックを行う方法もあわせてご覧ください。
様々な形式の文字列を手動でパースする
APIや入力から受け取る日付は様々な形式があります。形式が決まっているなら、手動でパースするのが最も確実です。
固定フォーマットを手動パース
// "2024/04/01" 形式をパース
function parseSlashDate(str) {
const [y, m, d] = str.split("/").map(Number);
return new Date(y, m - 1, d); // 月は0始まり
}
console.log(parseSlashDate("2024/04/01").toLocaleDateString("ja-JP")); // "2024/4/1"
// "20240401" 形式をパース
function parseCompact(str) {
const y = str.slice(0, 4);
const m = str.slice(4, 6);
const day = str.slice(6, 8);
return new Date(`${y}-${m}-${day}T00:00:00`); // ローカル時刻として扱う
}
非ISO形式はブラウザ依存:
new Date("2024/04/01") や new Date("April 1, 2024") のようなISO 8601以外の形式は解釈がブラウザ・環境によって異なり、Safariや古い環境では Invalid Date になることがあります。確実に動かすにはISO形式か上記の手動パースを使ってください。変換後の Date 操作
Date型に変換した後は、各メソッドで情報を取り出せます。
Date から値を取り出す
const d = new Date("2024-04-01T10:30:00");
console.log(d.getFullYear()); // 2024
console.log(d.getMonth() + 1); // 4 ※getMonthは0始まりなので+1
console.log(d.getDate()); // 1
console.log(d.getHours()); // 10
console.log(d.getMinutes()); // 30
// フォーマット済み文字列
console.log(d.toLocaleDateString("ja-JP")); // "2024/4/1"
console.log(d.toISOString()); // "2024-04-01T01:30:00.000Z"(UTC変換)
ロケールやタイムゾーンを細かく指定して表示したい場合は
Intl.DateTimeFormat が便利です。現在日付を yyyy-mm-dd で取得する方法は現在の日付を取得して表示する方法を参照してください。よくある質問(FAQ)
Qnew Date() が “Invalid Date” を返すのはなぜですか?
A日付文字列のフォーマットが解析できない場合に Invalid Date になります。
"2024/04/01" はISO形式ではないためブラウザによって挙動が異なります。確実に動作させるには "2024-04-01"(ISO形式)または手動パースを使い、isNaN(date.getTime()) で有効性を確認してください。Q2つの日付の差分(日数)を求めるには?
ADateオブジェクト同士を引き算するとミリ秒差が得られます。
const diffDays = (d2 - d1) / (1000 * 60 * 60 * 24); で日数差を計算できます。QISO日付を渡すと1日ずれるのはなぜですか?
A
new Date("2024-04-01") のようなISO日付のみの文字列はUTCの0時として解釈され、JST(UTC+9)では9時間ずれて表示されるためです。ローカル時刻として扱いたい場合は"2024-04-01T00:00:00"(時刻付き)や、new Date(2024, 3, 1)(数値指定)を使います。Qdayjs・date-fns などのライブラリを使うべき場合は?
A複雑なタイムゾーン処理・ロケール対応・多彩なフォーマット変換が必要なら dayjs や date-fns が便利です。シンプルな変換や比較だけなら標準の Date オブジェクトで十分です。
まとめ
JavaScriptで文字列をDate型に変換する方法のポイントを整理します。
- new Date(“ISO文字列”):最も基本。ISO 8601形式が確実
- Date.parse():ミリ秒で比較・演算したい場面に便利
- 手動パース:yyyy/mm/dd など固定フォーマットに確実
- ISO日付のみはUTC解釈でJSTでは1日ずれる点に注意
- 変換失敗は
isNaN(date.getTime())で判定し、非ISO形式はブラウザ差異に注意
関連として、日付のフォーマットを変換する方法・現在の日付を取得する方法・日数の差を計算する方法もあわせて確認すると、日付処理全般に強くなれます。

