時刻 へ戻る
Relative time — 「3 時間前」「2 週間後」表現を ja/en 両対応で生成

Relative time — 「3 時間前」「2 週間後」表現を ja/en 両対応で生成

対象日時と基準日時 (デフォルトは「今」) を入れて、`Intl.RelativeTimeFormat` で「3 時間前」「2 週間後」「yesterday」「in 3 months」などのローカライズされた相対時間表現を生成します。GitHub の `2 days ago`、Slack の `3h`、Twitter の `5m` 風のタイムスタンプ表示を実装する前にフォーマットの結果を確認できます。出力は **同時に ja / en の両方** を表示し、スタイル (long / short / narrow) と numeric (always / auto) を切替可能。さらに 7 スケール (年 / 月 / 週 / 日 / 時 / 分 / 秒) の **個別 RelativeTime** をテーブルで併記するので「秒で計算するか、日で計算するか」のしきい値設計の参考にもなります。`date-diff` は数値内訳を出すツール、`duration-format` は経過秒数を `01:30:00` / `1h30m` に変換するツール。本ツールは「人間にとって自然な相対表現」に特化。データは外部に送信されません。

使い方

対象日時と基準日時を入力 (基準は「今」のボタンで自動更新)。 スタイル (long / short / narrow) と Numeric (auto / always) を切替。 出力カードに ja / en の両方が並んで表示されます。「コピー」ボタンでそれぞれをクリップボードへ。 下のテーブルで 7 スケール (年 / 月 / 週 / 日 / 時 / 分 / 秒) すべての候補表示を確認できます。

詳細解説

相対時間文字列に含まれる日時情報

「3 日前」「2 週間後」「昨日」——相対時間の文字列を生成するために入力する対象日時と基準日時のペアは、ユーザーが何かのイベントを基準点として持っていることを示します。SNS のタイムスタンプ生成・通知システムの文言・ログの表示などに使う場合、その入力値が業務データの一部であることがあります。

特に「〇〇日前」という文言を生成するためのツールに日時を入力するとき、その日時がイベントの発生時刻(インシデント発生日・契約締結日・顧客からの問い合わせ日)を示す場合、外部サービスへの送信は業務上の情報漏洩になりえます。

オンライン Intl 検証ツールに日時を送ることの問題

Intl.RelativeTimeFormat のフォーマット結果を確認するために外部サービスを使う場合、入力する日時がサーバーのリクエストログに残ります。開発者が使う検証ツールであっても、テストデータとして実際の業務上の日時を入力してしまうことはよくあります。「本番のインシデントが何時間前に起きたか」を確認するために入力した日時が、外部ログに残ることは避けるべきです。

また、Intl.RelativeTimeFormat はブラウザ組み込みの API であり、外部サービスに頼る必要が本質的にありません。この API の動作検証・スタイル確認・numeric オプションの比較は、ブラウザ内だけで完結できます。

Intl.RelativeTimeFormat をブラウザ内で直接呼び出す仕組み

このツールは入力された 2 つの日時の差分を秒単位で計算し、new Intl.RelativeTimeFormat(locale, \{ style, numeric }).format(value, unit) を ja と en の両ロケールで呼び出します。7 スケール(年・月・週・日・時・分・秒)での出力テーブルも同じ API を繰り返し呼ぶだけです。外部ライブラリも外部 API も一切使いません。

DevTools の Network タブを開いたまま日時を変更しても、追加リクエストは発生しません。ブラウザの Intl 実装がそのまま結果を返すため、「自分が使うブラウザでの実際の出力」を確認できます——ブラウザエンジンによって出力が微妙に異なる場合があるため、この点は実用上も重要です。

実装に使う前に確認しておくべきこと

Intl.RelativeTimeFormatnumeric: auto オプションは yesterday / tomorrow などの自然言語表現を優先しますが、どの値でその表現に切り替わるかはロケールとブラウザ実装によって異なります。本ツールの「スケール別表示候補」テーブルでブラウザ間の差異を事前に確認しておくと、UI 実装のテスト漏れを防げます。

週(week)スケールは多くのブラウザで auto モードでも last week を返さず、day スケールに留まる実装が多いです。本ツールはあえて 7 スケールすべてを並べて表示するので、自分の環境での動作を確認できます。コピーした結果を直接コードのドキュメントやテスト仕様に貼り付ける用途にも使えます。

Intl.RelativeTimeFormat の内部実装と CLDR データソース

Intl.RelativeTimeFormat は ECMAScript Internationalization API (ECMA-402) で標準化された比較的新しい API で、各ブラウザの V8 / JavaScriptCore / SpiderMonkey はそれぞれ Unicode CLDR (Common Locale Data Repository) を参照して文言テーブルを保持します。new Intl.RelativeTimeFormat('ja').format(-3, 'day')3 日前 を返す挙動は、CLDR の <unitPattern count="other">{0} 日前</unitPattern> に対応します。count 属性は CLDR の plural rules に基づき、zero / one / two / few / many / other の 6 種類のうち、ロケールごとに実際に使われるカテゴリが異なります(日本語は other のみ、英語は oneother、ロシア語は one / few / many / other)。

numeric: 'auto' オプションは「自然言語表現を優先」ですが、どこで切り替わるかはロケールと CLDR データに依存します。英語の format(-1, 'day')auto モードで yesterday を返す一方、format(-2, 'day')2 days ago です。日本語の format(-1, 'day')昨日 を返しますが、week スケールは多くの実装で last week 相当の自然語が存在しないため、numeric: 'auto' でも 1 週間前 のように数値表現に留まります。これらの境界条件は本ツールの並列表示で確認可能です。style: 'narrow'3d ago'short'3 days ago'long'3 days ago(多くの言語で long と short は同じ)です。

実装での使い分けパターンと既知のブラウザ間差異

agoString(date) ヘルパーを実装するとき、しきい値の設計が重要です。GitHub の表示は < 1 minjust now< 60 minN minutes ago< 24 hN hours ago< 30 dayN days ago> 30 day → 絶対日付(May 18, 2026)に切り替える方式です。Slack の 3hstyle: 'narrow' + 単位を細かく切り替える設計。Twitter(X)の 5mstyle: 'narrow'minute 単位を 60 分まで、h 単位を 24 時間まで、それ以上は絶対日付に切り替えるパターンです。本ツールの 7 スケール並列表示で、どのしきい値設計が自分の UI に合うか試算できます。

ブラウザ間差異の代表例として、week 単位の auto モード処理が挙げられます。Chrome(V8)は多くのロケールで last week 相当の自然語を返しませんが、Firefox(SpiderMonkey)は一部ロケールで返す実装があります。quarter 単位は CLDR には定義されていますが Intl API としてはサポートされていません(format(-1, 'quarter') はエラーまたは数値フォールバック)。fortnight(2 週間)や decade(10 年)も同様に Intl 標準外です。これらが必要な場合は Intl.NumberFormat で数値だけフォーマットして手書きで / の単位を付ける運用になります。Temporal API(Stage 3)にも Temporal.RelativeTimeFormat 相当の機能はなく、当面 Intl.RelativeTimeFormat が標準のままです。基準日からの「絶対的な日数差」を別途見たい場合は date-diff を、得られた相対時間を PT3H のような ISO 8601 期間として書き直したい場合は duration-format を、基準日を未来側に N 単位分動かしたい場合は time-arithmetic を併用すると、いずれも入力日時を外部に出さずに扱えます。

よくある質問

`Intl.RelativeTimeFormat` は何のためのもの?
ブラウザ標準の API で、`new Intl.RelativeTimeFormat('en').format(-3, 'day')` のように呼ぶと `3 days ago` のようなローカライズ済み相対時間文字列を返します。GitHub の `2 days ago`、Slack の `3h`、Twitter の `5m` 風の表示はこれをラップして実装されることが多いです。
Numeric の auto と always の違いは?
`auto` は `yesterday` / `tomorrow` / `last year` / `next month` などの自然言語表現を優先します。`always` は常に数値で表示 (`1 day ago` / `in 1 month`)。`auto` のほうが人間的ですが、絶対値を出したい場面 (ログ、ソート可能な表示など) は `always` が無難。
Style の long / short / narrow の違いは?
`long` = `3 days ago`、`short` = `3 days ago` (英語では同じ単位語が使われる)、`narrow` = `3d ago` のようにユニットがさらに短縮されます。日本語ではすべての style で同じ単位 (`日`) が使われるなど、言語によって差は様々です。並列表示で違いを目視確認できます。
「秒で計算するか、日で計算するか」のロジックを書きたい
本ツールの「スケール別の表示候補」テーブルが参考になります。たとえば `agoString(diffSeconds)` を書くなら、`60 秒未満 → 秒`、`60 分未満 → 分`、`24 時間未満 → 時間`、`7 日未満 → 日`、`4 週未満 → 週`、`12 ヶ月未満 → ヶ月`、それ以上 → 年 という分岐がよく使われます。
週 (week) のしきい値は適当?
週は `RelativeTimeFormat` の単位として規定されていますが、auto モードで `last week` を出すブラウザは限られます。多くの実装は `日` で済ませて `週` を飛ばします。本ツールはあえて 7 スケールすべてを表示するので、サポート差を確認できます。
データはどこかに送信されますか?
いいえ。`Intl.RelativeTimeFormat` はブラウザ組み込みなので、外部送信は一切ありません。

「送らない」を確かめるには

このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。

類似のツール

日付の差を計算 — 日数 / 週 / 月 / 年 / 営業日カウント

日付の差を計算 — 日数 / 週 / 月 / 年 / 営業日カウント

2 つの日付の差を、日数 / 週 / 営業日 / 「Y 年 M ヶ月 D 日」 / 時刻まで含めた合計時間・分・秒で同時に算出。終了日を含めるか、時刻を含めるかをチェック 1 つで切り替え。すべてブラウザ内で計算します。

時刻Diff計算
期間フォーマット変換 — 秒・mm:ss・hh:mm:ss を相互変換

期間フォーマット変換 — 秒・mm:ss・hh:mm:ss を相互変換

経過時間 (Duration) を 3 つのフォーマット間で相互変換します。秒数 (5400)、時計表示 (01:30:00)、人間可読 (1h30m) のうち、欲しい出力形式を選ぶだけ。入力は自動判別で、3 形式が 1 行ずつ混在していても OK。複数行を一括変換し、parse できない行は件数だけ表示。1d (= 86400 秒) も含めた d/h/m/s 単位に対応。すべてブラウザ内で処理。

時刻変換整形
日時計算 — 加算 / 減算 (年・月・週・日・時間・分・秒)

日時計算 — 加算 / 減算 (年・月・週・日・時間・分・秒)

基準の日時に対して年・月・週・日・時間・分・秒の単位で加算・減算します。納期計算、契約満了日、N 日後の予定、N 時間前のミーティング時刻など。月末同士の加算 (1/31 + 1 月 → 2/28 か 2/29) は JavaScript の Date と同様にロールオーバーします。結果は YYYY-MM-DD HH:MM:SS + 曜日 + 基準からの差サマリ + Unix エポック秒で表示。すべてブラウザ内で計算するため、入力した日時は外部に出ません。

時刻計算
年齢計算 — 誕生日から満年齢・干支・星座を一発で

年齢計算 — 誕生日から満年齢・干支・星座を一発で

生年月日と基準日を入力すると、満年齢・数え年・生まれてからの日数・干支 (十二支)・星座を一発で計算。基準日を変えれば過去や未来の特定日における年齢も分かります。すべてブラウザ内で計算するので、誕生日データを外部に送信しません。

時刻計算