休憩を差し引いた勤務時間の合計計算
勤務時間合計計算ツールは、出勤と退勤の記録一覧を足し合わせ、各シフトに入力された無給休憩を差し引いて、明確な実働時間を返します。ISO日時にはZまたは明示的なUTCオフセットが必要です。そのため、異なる拠点、夏時間の期間、深夜勤務の記録も、同一のUTC時間軸で比較できます。結果には控除前の総時間、休憩の合計分数、対象シフト数も表示されるため、計算内容の確認にも自動処理にも利用できます。
無料で実行
曖昧さのない完全なシフト記録を入力します
連続した勤務期間ごとに1行を入力してください。各行には、clock_inとclock_outの日時が必要です。どちらもISO 8601形式で、秒までの時刻に加えて、Zまたは-04:00のような数値のUTCオフセットを含めます。時刻変更が行われる際、現地時刻だけでは一つの瞬間を特定できないため、オフセットは必須です。シフトに無給休憩がある場合はbreak_minutesを追加し、控除が不要な場合は省略してください。元の勤怠システムが1分未満の端数を記録する場合に備え、小数の休憩分数も使用できます。退勤が翌日になってもよいため、夜勤専用の設定は必要ありません。存在しない日付、オフセットの欠落、出勤以前の退勤、負の休憩、シフト時間を超える休憩はエラーになります。UTCに正規化した後でシフト同士が重なる場合も、勤務時間の二重計上を防ぐため受け付けません。各行を明示することで入力を監査でき、昼休みの制度、丸め規則、シフト間の空き時間を休憩とみなすかどうかを暗黙に推測せずに済みます。
UTCによる計算方法を確認します
各タイムスタンプはグレゴリオ暦の値として解析され、記載されたオフセットを使ってUTCのミリ秒位置に変換されます。この計算では、端末のタイムゾーン、タイムゾーンデータベース、現在の日付、外部サービスのいずれも参照しません。有効な行ごとに、UTCの退勤時刻からUTCの出勤時刻を引いて控除前の勤務時間を求めます。入力された休憩は分からミリ秒へ変換し、その行の勤務時間から差し引きます。最終的な実働時間を出す前に、控除前の勤務時間と休憩時間をそれぞれ別に合計します。この順序により、異なるオフセットを使うチームの記録や、日付をまたぐシフトでも安定した結果になります。出力には、実働時間のtotal_hours、分単位を利用するシステム向けのtotal_minutes、控除前のgross_hours、休憩合計のbreak_minutes、照合用のshift_countが含まれます。時間と分は出力時に限り小数点以下6桁へ丸め、内部では整数のミリ秒のまま加算します。そのため、ブラウザーの言語やサーバーの場所が変わっても、同じ入力から同じJSONが得られます。
給与計算や報告業務で結果を活用します
返される項目は、元の打刻時間と最終的な支払対象時間を分けて示すため、確認担当者が計算を再現できます。total_hoursを確定する前に、shift_countを取り込んだ行数と、gross_hoursを打刻の総時間幅と、break_minutesを予定された無給控除と照合してください。この機能は、残業区分、有給休憩の規則、賃金単価、勤務時刻の許容幅、組織固有の丸めを適用しません。これらの方針は契約や法域によって異なるため、明確に文書化した後続工程で適用してください。また、別々の行の間にある空き時間から休憩を推測することもありません。差し引くのは、入力されたbreak_minutesだけです。したがって、隠れた制度を組み込まずに、給与準備、業務委託者の請求書、プロジェクト別工数報告、出勤記録の照合に使える決定的な構成要素になります。個別確認はブラウザーで無料実行でき、APIによる自動化は1リクエストあたり$0.002です。繰り返し取り込む場合は、返された要約とともに元のISO文字列とオフセットを保存すると、疑義のある合計を使用した正確な時点と控除まで追跡できます。
活用例
給与用の勤務時間を準備
承認済みのシフトと無給休憩を実働時間にまとめてから、単価や残業規則を適用できます。
業務委託者の請求書を確認
確認者の現地タイムゾーンに依存せず、タイムスタンプを根拠に請求時間を再計算できます。
出勤記録のエクスポートを照合
控除前時間、休憩控除、シフト数を、勤怠システムから出力した記録と比較できます。
よくある質問
1回のリクエスト料金はいくらですか?
APIによる自動化は1リクエストあたり$0.002です。ブラウザーでは無料で計算することもできます。
必要な日時形式は何ですか?
日付、秒までの時刻、Zまたは明示的なオフセットを含むISO 8601を使用してください。例は2026-07-20T09:00:00-04:00です。
休憩はどのように入力しますか?
各シフトのbreak_minutesに無給休憩の分数を設定してください。省略したシフトの控除はゼロになります。
残業時間や賃金も計算しますか?
いいえ、返すのは時間だけです。残業の基準、丸め、賃金単価、労働規則は別の工程で適用してください。
重複するシフトが拒否されるのはなぜですか?
重複区間は同じ時間を二重に数えるためです。合計を水増しせず、勤怠記録の矛盾として通知します。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/date/timesheet-total \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}'const res = await fetch("https://api.kit.forhosting.com/date/timesheet-total", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/date/timesheet-total",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/date/timesheet-total", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"shifts":[{"clock_in":"2026-07-20T09:00:00-04:00","clock_out":"2026-07-20T17:30:00-04:00","break_minutes":30},{"clock_in":"2026-07-21T09:15:00-04:00","clock_out":"2026-07-21T17:00:00-04:00","break_minutes":45}]}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/date/timesheet-total", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"shifts": [
{
"clock_in": "2026-07-20T09:00:00-04:00",
"clock_out": "2026-07-20T17:30:00-04:00",
"break_minutes": 30
},
{
"clock_in": "2026-07-21T09:15:00-04:00",
"clock_out": "2026-07-21T17:00:00-04:00",
"break_minutes": 45
}
]
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.timesheet_total",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
制限
max_items | 10000 |
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |