日付範囲の共通部分
2つの時間区間を入力すると、重なっている部分が分かります。UTCの10:00〜12:00と11:00〜13:00なら、共通部分は11:00〜12:00のちょうど1時間です。端が接するだけなら結果は空になります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 区間Aの開始
- 2020-01-01T10:00:00.000Z
- 区間Aの終了
- 2020-01-01T12:00:00.000Z
- 区間Bの開始
- 2020-01-01T11:00:00.000Z
- 区間Bの終了
- 2020-01-01T13:00:00.000Z
- 共通区間の開始
- 2020-01-01T11:00:00.000Z
- 共通区間の終了
- 2020-01-01T12:00:00.000Z
- 共通区間の長さ(ミリ秒)
- 3,600,000
- 共通区間の長さ(時間)
- 1
二つのISO時間区間の交差を厳密な順序とミリ秒・時間の継続時間で計算します。決定的で端末内完結、アカウント不要で使えます。
2つの時間区間の重なりとは
2つの時間区間が重なるとは、両方に含まれる時間があるということです。会議室の2つの予約や、サポート画面に並ぶ2つの障害時間帯を思い浮かべてください。知りたいのはそれぞれの長さではなく、共通する部分です。考え方は簡単で、2つの開始のうち遅いほうから、2つの終了のうち早いほうまでが共通部分になります。その開始が終了より厳密に前であれば重なりがあり、共通部分とその長さがミリ秒と時間で表示されます。UTCの10:00〜12:00と11:00〜13:00なら、重なりは11:00〜12:00の1時間です。
間違えやすい境界の扱い
12:00に終わる区間と12:00に始まる区間のように端が接するだけの場合、区間の終わりは含まないため共通の時間はなく、結果は空で長さはどちらも0です。このツールは2つの区間を合わせた範囲ではなく、共通部分だけを返します。入力はISO 8601形式の日時で、結果はUTCで表示されます。終わりが始まりより前の区間や、欠けた値、正しくない値は、空の重なりとして扱わずにお知らせします。
入出力と境界条件
一点だけで接する隣接区間は厳密な小なり比較のため空になります。これは終端を排他的に扱う予定表と整合します。重なる窓は共通部分だけを返し、和集合は返しません。
型不正・欠落・逆転範囲は早期失敗し、静かなnull交差を防ぎます。一時間の重なり・空の非交対・Aの逆転・完全欠落の黄金例があり、UIは文書化されたキーだけをバインドすればよいです。
活用例
会議の重なり
二つの予約の共有窓を安定した継続時間で求めます。
サポート画面
表計算なしで二つの障害窓の一致を強調します。
自動化
カレンダーフィードを結合するスクリプトから同じ純関数を呼びます。
よくある質問
無料ですか?
はい。 Tier A はブラウザだけで動き、アカウントは不要です。
2つの区間の重なりはどう計算しますか?
2つの開始のうち遅いほうが共通部分の開始、2つの終了のうち早いほうが共通部分の終了になります。その開始が終了より前なら重なりがあり、そうでなければ結果は空で長さは0です。
一方が終わる瞬間にもう一方が始まる場合はどうなりますか?
結果は空になります。多くの予約システムと同じく区間の終わりは含まないものとして扱うため、1点で接するだけの2つの区間には共通の時間がありません。
2つの区間を合わせた範囲は返しますか?
いいえ。返すのは両方に共通する部分だけで、2つを合わせた範囲は返しません。重ならない場合は、空の結果と長さ0を返します。
終わりが始まりより前の区間を入れるとどうなりますか?
受け付けません。値が欠けている場合や形式が正しくない場合、逆向きの区間はすぐに分かりやすいメッセージでお知らせするので、入力ミスが空の結果として見過ごされることはありません。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/date/interval-intersection \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}'const res = await fetch("https://api.kit.forhosting.com/date/interval-intersection", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/interval-intersection",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/interval-intersection", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"a_start":"2020-01-01T10:00:00.000Z","a_end":"2020-01-01T12:00:00.000Z","b_start":"2020-01-01T11:00:00.000Z","b_end":"2020-01-01T13:00:00.000Z"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/interval-intersection", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"a_start": "2020-01-01T10:00:00.000Z",
"a_end": "2020-01-01T12:00:00.000Z",
"b_start": "2020-01-01T11:00:00.000Z",
"b_end": "2020-01-01T13:00:00.000Z"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.interval_intersection",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
区間交差の仕組み
交差の開始は二つの開始の最大、終了は二つの終了の最小です。そうでなければ empty が真で start/end は null、両継続時間は零です。区間AとBは a_start・a_end・b_start・b_end の四つのISO-8601時刻で定義されます。エンジンは環境のDateパーサで各端点を解析し、文字列でない値や解析不能な値をフィールド名付きの invalid_input で拒否し、a_start が a_end より厳密に小さく b_start が b_end より厳密に小さいことを要求します。開始が終了より厳密に小さいとき結果は空でなく、UTCのISO文字列の start/end と安定小数の duration_ms・duration_hours を返します。
入出力と境界条件
四フィールドは必須文字列なので、スキーマ探査は公開例から完全なサンプルを組めます。
決定性・限界・組み込み
実装は入力の時刻以外にネットワークも時計も乱数も使わない純パース論理なので、同じ入力は常に同じ出力になります。保存時にその契約を文書化してください。極端に遠い時刻はプラットフォームDateのIEEEミリ秒精度に従います。メトリクスを繋ぐ前にスキーマを確認し、成功キー empty・start・end・duration_ms・duration_hours だけをバインドしてください。
技術的な質問
通信しますか?
いいえ。パースエンジンは端末内で完結します。
入力が不正なときは?
明確な英語メッセージ付きの invalid_input を返します。
結果は安定しますか?
はい。決定的計算と黄金例が契約を固定します。
作者は誰ですか?
ForHosting KIT 工房の Aspire です。