📑

JavaScriptで日時の差分を計算する方法とISO形式の扱い方

に公開

初めに

jsのDate()オブジェクトについて色々調べたのでまとめます。

Date()について

const d : Date = new Date();
console.log(d) // 出力; Sun Jul 20 2025 20:00:08 GMT+0900 (日本標準時)

Dateインスタンスを出力すると、Sun Jul 20 2025 20:00:08 GMT+0900 (日本標準時)のように表示されます。
これはローカルな環境での現在時刻をdateString形式で出力しているからです。

どうやって取得しているのか

console.log(d.getTime()); // 出力 1753072877639

getTime()を使用すると、UNIX時間で現在時刻を取得できます。
UNIX時間とは1970年1月1日午前0時からの経過した時間をミリ秒単位で表した数値です。
これにより、1日は1000 * 60 * 60 * 24と定義され、時間を算出します。

Locale,UTC,ISOについて知る。

const d : Date = new Date("August 19, 1975 23:15:30");
console.log(d.toLocaleString()); // 出力:1975/8/19 23:15:30
console.log(d.toUTCString()); // 出力:Tue, 19 Aug 1975 14:15:30 GMT
console.log(d.toISOString()); // 出力;1975-08-19T14:15:30.000Z

toLocaleString()はDateオブジェクトの内容をローカルの時刻形式で表示します
toUTCString()は世界標準時(GMT)での時間に変更します。
toISOString()ISO8601形式に変更します。

ISO8601とはなんなのか

ISO8601はYYYY-MM-DDTHH:mm:ss.sssZの形式で表せる文字列のこと
ミリ秒の後のZはタイムゾーンオフセット[1]のことでZの場合はUTCを示します。

ISOでAPIに送信し、ローカルに変換して受け取る。

APIを利用することを考えてみる。
APIで日付を送信する際にはISO8601を利用すると環境に依存しない安定したデータをやり取りできるため便利です。

投稿を送信し、その後受信してローカル時間に変換して表示する例をもとに考えてみる。

// 送信側
const post = {
  title: "Date()について学ぶ。",
  createdAt: new Date().toISOString(), // ISO8601形式で送信!
};

// APIに送信する
fetch("/api/posts", {
  method: "POST",
  headers: {
    "Content-Type": "application/json",
  },
  body: JSON.stringify(post),
});


// 受信側
const post = {
  title: "Date()について学ぶ。",
  createdAt: "2025-07-21T12:34:56.000Z", // ISO8601形式(UTC)
};

// ローカル時間に変換して表示
const localTime = new Date(post.createdAt).toLocaleString();
console.log(`ローカル時間: ${localTime}`); // 例: "2025/7/21 21:34:56"

// ニューヨークでの時間
const nyTime = new Date(post.createdAt).toLocaleString("en-US", {
  timeZone: "America/New_York",
});
console.log("ニューヨーク時間:", nyTime); // 例: "7/21/2025, 8:34:56 AM"

// 日本時間
const tokyoTime = new Date(post.createdAt).toLocaleString("ja-JP", {
  timeZone: "Asia/Tokyo",
});
console.log("日本時間:", tokyoTime); // 例: "2025/7/21 21:34:56"

送信側はtoISOStringで変換して日付をAPIに送信します。
そのため、受信側は受け取ったデータをローカルの時間に変更して取得する必要があります。
toLocaleString()は既定のロケールに対応して時刻が変換されるため、国別で表示したい場合はタイムゾーン及びロケールを指定する必要があります。

Date()の引数について

new Date(); // 現在
new Date("August 19, 1975 23:15:30"); // ブラウザやロケールに依存するため、推奨されません
new Date("1995-12-17T03:24:00") // ISO8601形式。信頼性がある。
new Date(1995,11,17); // 内容:1995年12月17日 00:00:00
new Date(1995, 11, 17, 3, 24, 0) // 内容:1995年12月17日 03:24:00
new Date(628021800000) // UNIX時間

Date()のコンストラクタには引数が存在しない場合は現在時刻を返します。
Date()ではISO8601やdateStringのほかにもnew Date(year, monthIndex, day, hours, minutes, seconds, milliseconds)のように数値で入力することができます。
dayからは省略可能で既定値は1、以降の時間に関しては既定値0です。
月(monthIndex)0から11の値なので注意。

差分について考えてみる。

次に現在時刻と設定されている時刻との差について日付、時間、分の3つを考えてみる。

const date : number =  new Date("1995-12-17T03:24:00").getTime();
const now : number = new Date().getTime();
const diff : number = now - date;

const diffInDays: number = Math.floor(diff / (24 * 60 * 60 * 1000));
const remainderAfterDays = diff % (24 * 60 * 60 * 1000); // 差分の1日以下の余りを取得

const diffInHours: number = Math.floor(remainderAfterDays / (60 * 60 * 1000));
const remainderAfterHours = remainderAfterDays % (60 * 60 * 1000); // 差分の1時間以下の余りを取得

const diffInMinutes: number = Math.floor(remainderAfterHours / (60 * 1000));
console.log(`差分:${diffInDays}${diffInHours}時間 ${diffInMinutes}`);

差分についてはgetTime()を使用してUNIX時間に直して比較します。
日付に関しては1日あたり24 * 60 * 60 * 1000と表せるのでそのまま割って求めます。
時間に関しては1日分の余りから1時間あたり60 * 60 * 1000を割って求めます。
分単位に関しても同様に1時間分の余りから1分あたり60 * 1000を割って求めます。

最後に

以上です。今回はcliを使って記事を書いてみました。
結構使いやすい!!

脚注
  1. Z以外にも+または-に続いてHH:mmの形式の場合もあります。+09:00など ↩︎

GitHubで編集を提案

Discussion