時間区間の合計所要時間
時間区間の一覧を入力すると、実際に覆われている時間の合計が分かります。UTCの10:00〜12:00と11:00〜13:00なら、単純な足し算の5時間ではなく3時間です。重なる区間や接する区間は先にまとめます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
運用チーム、給与スクリプト、SLA ツールは、オンコール勤務、機材予約、ダウンタイム枠、課金セッションなど、重なり合う明示的な時間区間を多く保持することがあります。各区間を素朴に足すと、共有分が二重計上されます。この時間区間の合計所要時間計算機は、ISO-8601 の開始と終了の組の一覧を受け取り、純粋なグレゴリオ算術で各境界を絶対 UTC に正規化し、重なるまたは接する区間をマージし、被覆スパンの長さをミリ秒・秒・時間で返すとともに、日・時・分・秒の内訳も返します。端点で接する隣接予約は連続セグメントになるため、長さゼロの接点が合計を膨らませることはありません。
重なりをマージした後の被覆所要時間の意味
被覆所要時間は、各区間の生の長さの合計ではなく、絶対時間軸上での区間の和集合の測度です。アリスが同日 UTC で十時から十二時、ボブが十一時から十三時を予約した場合、素朴な合計は五時間ですが、被覆スパンは十時から十三時までの三時間だけです。
各開始と終了は UTC エポックミリ秒に変換され、一覧は開始時刻で並べ替えられ、次の区間は、現在の開セグメントの終了以前に始まればそのセグメントを延長し、正の隙間があれば新しいセグメントを開きます。十二時終了と十二時開始のように接する区間は一つの連続ブロックにマージされ、これは被覆・稼働率・SLA 稼働の連続時間モデルとして正しいです。
長さゼロや反転した区間は正の開スパンを定義しないため拒否されます。
合計時間の計算が役立つ場面
人材・オンコール基盤はシフト断片をマージし、給与と疲労ルールが重なる二重時間ではなく連続被覆を課金できるようにします。施設・ラボ予約システムは予約が積み重なる部屋や機器の稼働率を計算し、毎回のレポートで独自の SQL ウィンドウ関数なしに利用ダッシュボードへ供給します。
サイト信頼性・ステータスページは多数の部分障害区間を月次 SLA 計算用の一つの被覆ダウンタイム長に変換します。プロジェクト時間トラッカーは、わずかにずれた時計で同じ作業を二度記録したモバイルとデスクトップの重複セッションログを統合します。
ちょうど二つの範囲の重なりが必要なときは区間交差と、単一の秒数から読みやすい文だけが必要なときは humanize-duration 系と組み合わせてください。
活用例
オンコールとシフトの被覆合計
チームの重なる勤務枠をマージし、給与と疲労チェックが同時シフトを二重計上せず被覆時間を使うようにします。
部屋と資源の稼働率
予約が重なる実験台や会議室について予約の和集合を合計し、生 SQL なしで利用レポートを作成します。
部分障害からの SLA ダウンタイム
多数のインシデント区間を一つの被覆障害時間にまとめ、月次可用性計算とステータス書き出しに使います。
よくある質問
重なる分は二回数えられますか?
いいえ。 区間は合計前に並べ替えとマージが行われるため、共有被覆は被覆合計所要時間に一度だけ寄与します。
二つの区間が端点だけで接する場合は?
一つの連続セグメントにマージされます。接する境界は隙間を作らず、結合スパンを超える余分な所要時間も加えません。
区間はいくつまで入力できますか?
1つの一覧に1個から200個までです。各区間には開始と終了が必要で、開始は終了より厳密に前でなければなりません。長さ0の区間や逆向きの区間は受け付けません。
時刻なしの日付だけでも入力できますか?
はい。日付だけの値はUTCの午前0時として扱うので、日単位の集計が簡単です。時刻にはUTCを示すZか数値のオフセットを付けられ、すべてUTCに直してからまとめます。
どの区間がまとめられたかを確認できますか?
はい。まとめた後の各区間を開始・終了・長さとともに一覧にし、入力した区間の数とまとめた後の数も並べて示すので、合計を確かめられます。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/date/intervals-total-duration \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}'const res = await fetch("https://api.kit.forhosting.com/date/intervals-total-duration", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/intervals-total-duration",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/intervals-total-duration", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"intervals":[{"start":"2020-01-01T10:00:00Z","end":"2020-01-01T12:00:00Z"},{"start":"2020-01-01T11:00:00Z","end":"2020-01-01T13:00:00Z"}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/intervals-total-duration", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"intervals": [
{
"start": "2020-01-01T10:00:00Z",
"end": "2020-01-01T12:00:00Z"
},
{
"start": "2020-01-01T11:00:00Z",
"end": "2020-01-01T13:00:00Z"
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.intervals_total_duration",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
無効な ISO 形、反転した範囲、空リストは invalid_input で失敗し、課金されません。
重なりをマージした後の被覆所要時間の意味
本エンドポイントは古典的なソート・マージアルゴリズムを実装します。応答は input_count と merged_count を報告し、統合の程度が分かり、各マージ済みセグメントを監査用に start・end・duration 付きで列挙します。整数の主測度が必要なときは total_duration_ms を、安定した十二桁小数の時間値がダッシュボードに必要なときは total_duration_hours を、再除算なしで読みやすい行を描画するときは days・hours・minutes・seconds を併用してください。
入力契約、ISO 境界、応答の形
要素数は一から二百までです。四桁の年・月・日に続き、任意で時・分・秒と小数秒を付けられます。日付のみの値は UTC の真夜中として扱い、時計を捏造せずに日単位の枠を使えます。検証失敗は残高を消費しません。必須の intervals 配列を持つ JSON 本体を POST してください。各オブジェクトは ISO-8601 形式の文字列フィールド start と end を含む必要があります。末尾の Z は UTC を意味し、プラス零二コロン零零やマイナス零五コロン零零のような数値オフセットはマージ前に局所フィールドを絶対 UTC にずらします。正規化後、start は end より厳密に前でなければならず、等しいまたは反転した境界は区間インデックスを示す invalid_input で失敗します。成功時の本体には input_count、merged_count、total_duration_ms、total_duration_seconds、total_duration_hours、非負の内訳 fields days・hours・minutes・seconds・milliseconds、zero d three h zero m zero s のような短い formatted 文字列、ISO UTC 端点を持つ順序付き merged_intervals 配列、および method の intervals_total_duration が含まれます。任意の null フィールドは決して出力されません。例:十時から十二時と十一時から十三時 UTC の重なる時間枠二つは三時間の一つのセグメントにマージされ、total_duration_ms は一千八十万になります。公開上限以下にリストを保ち、エッジ Worker のメモリ予算内で現実的なバッチを処理してください。
時間区間の合計所要時間 API が価値を生む場面
実装は pure parse の tier A のため、成功する各呼び出しはモデルトークンも外向きネットワークもなく公開の基本価格 $0.002 です。リファクタがマージ接触セマンティクスを黙って変えないよう、テストで merged_intervals と total_duration_ms を固定してください。
技術的な質問
重なる時間区間の合計所要時間はどう計算しますか?
intervals を {start, end} の ISO-8601 日時の配列として JSON で送ってください。API は UTC で重なりをマージし、total_duration_ms、total_duration_seconds、total_duration_hours、merged_intervals を返します。
どのような入力エラーが拒否されますか?
空または欠落した intervals、非オブジェクト、無効な ISO 文字列、存在しない暦日、start が end より厳密に前でない場合は invalid_input で失敗し、課金されません。
時間区間の合計所要時間ツールの料金は?
ブラウザツールは無料です。API リクエストは成功した呼び出しごとに前払い KIT 残高から $0.002 です。無効入力は課金されません。