Arbeitsstunden abzüglich Pausen berechnen
Der Rechner für die Stundenzettelsumme addiert eine Liste aus Ein- und Ausstempelungen, zieht die je Schicht eingetragene unbezahlte Pause ab und liefert eine übersichtliche Nettozeit.
Im Browser ausführen – kostenlos
Jede ISO-Datumszeit muss entweder Z oder einen ausdrücklichen Offset enthalten. Dadurch lassen sich Einträge verschiedener Standorte, Zeiträume mit Zeitumstellung und Nachtschichten auf einer gemeinsamen UTC-Zeitleiste vergleichen. Das Ergebnis weist außerdem Bruttostunden, die gesamten Pausenminuten und die Anzahl der berücksichtigten Schichten aus, sodass Sie die Berechnung leicht prüfen oder automatisieren können.
Erfassen Sie vollständige und eindeutige Schichten
Geben Sie für jeden zusammenhängenden Arbeitszeitraum eine Zeile an. Jede Zeile benötigt eine clock_in-Datumszeit und eine clock_out-Datumszeit im Format ISO 8601, einschließlich Sekunden sowie Z oder eines numerischen UTC-Offsets wie -04:00. Der Offset ist unverzichtbar, da eine lokale Uhrzeit allein bei Zeitumstellungen keinen eindeutigen Zeitpunkt bezeichnet. Tragen Sie break_minutes ein, wenn die Schicht eine unbezahlte Pause umfasst; lassen Sie das Feld weg, wenn nichts abgezogen werden soll. Dezimale Pausenminuten sind zulässig und eignen sich für Quellsysteme, die Minutenbruchteile erfassen. Der Ausstempelzeitpunkt darf am folgenden Kalendertag liegen, sodass Nachtarbeit keinen besonderen Modus benötigt. Der Rechner weist unmögliche Daten, fehlende Offsets, Ausstempelungen vor oder gleich der Einstempelung, negative Pausen und Pausen oberhalb der Schichtdauer zurück. Nach der UTC-Normalisierung überlappende Schichten werden ebenfalls abgelehnt, da sie dieselbe Zeit unbemerkt doppelt zählen würden. Durch ausdrücklich angegebene Zeilen bleiben die Eingaben prüfbar; zugleich werden keine Annahmen über Mittagspausen, Rundungsvorschriften oder als Pause geltende Lücken zwischen Schichten getroffen.
So funktioniert die Berechnung in UTC
Jeder Zeitstempel wird als Wert des gregorianischen Kalenders gelesen und anhand seines angegebenen Offsets in eine UTC-Position in Millisekunden umgerechnet. Die Berechnung greift weder auf die Zeitzone des Geräts noch auf eine Zeitzonendatenbank, das aktuelle Datum oder einen externen Dienst zu. Für jede gültige Zeile ergibt sich die Bruttodauer aus dem UTC-Ausstempelzeitpunkt abzüglich des UTC-Einstempelzeitpunkts. Die eingetragene Pause wird von Minuten in Millisekunden umgerechnet und von der Bruttodauer dieser Zeile abgezogen. Anschließend werden sämtliche Bruttodauern und sämtliche Pausen getrennt addiert, bevor die endgültige Nettozeit entsteht. Diese Reihenfolge sorgt bei Teams mit unterschiedlichen Offsets ebenso wie bei Schichten über Mitternacht für stabile Ergebnisse. Die Ausgabe enthält total_hours als Nettoarbeitszeit, total_minutes für Systeme mit Minutenangaben, gross_hours vor Abzügen, break_minutes als gesamten Abzug und shift_count für den Abgleich. Stunden- und Minutenwerte werden erst bei der Ausgabe auf sechs Dezimalstellen gerundet; intern erfolgt die Addition weiterhin in ganzzahligen Millisekunden. Dieselben Eingaben erzeugen daher unabhängig von Browsersprache und Serverstandort dasselbe JSON.
Nutzen Sie das Ergebnis für Abrechnung und Berichte
Die zurückgegebenen Felder trennen die ursprünglichen Zeitdaten von der endgültigen vergütungsfähigen Dauer, damit eine prüfende Person die Rechnung nachvollziehen kann. Vergleichen Sie shift_count mit der Zahl importierter Zeilen, gross_hours mit der gesamten Stempelspanne und break_minutes mit den erwarteten unbezahlten Abzügen, bevor Sie total_hours übernehmen. Die Funktion wendet keine Überstundengrenzen, Vorschriften für bezahlte Pausen, Lohnsätze, Zeittoleranzen oder betrieblichen Rundungsregeln an. Solche Vorgaben hängen von Vereinbarung und Rechtsraum ab und gehören in einen späteren, klar dokumentierten Schritt. Ebenso leitet sie Pausen nicht aus Lücken zwischen getrennten Zeilen ab: Abgezogen werden ausschließlich die von Ihnen gelieferten break_minutes-Werte. Damit dient die Funktion als deterministischer Baustein für Lohnvorbereitung, Rechnungen selbstständiger Auftragnehmer, Projektzeitberichte und Anwesenheitsabgleiche, ohne versteckte Regeln einzubauen. Für eine einzelne Prüfung können Sie sie kostenlos im Browser ausführen; die Automatisierung per API kostet $0.002 je Anfrage. Bewahren Sie bei wiederholbaren Importen die ursprünglichen ISO-Zeichenfolgen und Offsets zusammen mit der Zusammenfassung auf, damit sich strittige Summen bis zu den verwendeten Zeitpunkten und Abzügen zurückverfolgen lassen.
Anwendungsfälle
Arbeitszeit für die Abrechnung vorbereiten
Fassen Sie genehmigte Schichten und unbezahlte Pausen zu einer Nettozeit zusammen, bevor Sie Lohnsätze oder Überstundenregeln anwenden.
Eine Auftragnehmerrechnung prüfen
Berechnen Sie fakturierte Arbeitszeit anhand der Zeitstempel neu, ohne von der lokalen Zeitzone der prüfenden Person abhängig zu sein.
Anwesenheitsexporte abgleichen
Vergleichen Sie Bruttozeit, Abzüge und Schichtanzahl mit den aus einem Zeiterfassungssystem exportierten Einträgen.
Häufige Fragen
Was kostet eine Anfrage?
Die Automatisierung per API kostet $0.002 je Anfrage; im Browser kann die Berechnung auch kostenlos ausgeführt werden.
Welches Datums- und Zeitformat ist erforderlich?
Verwenden Sie ISO 8601 mit Datum, Uhrzeit einschließlich Sekunden sowie Z oder einem ausdrücklichen Offset, zum Beispiel 2026-07-20T09:00:00-04:00.
Wie werden Pausen angegeben?
Setzen Sie break_minutes je Schicht auf die Dauer der unbezahlten Pause. Fehlt das Feld, beträgt der Abzug für diese Schicht null.
Berechnet die Funktion Überstunden oder Löhne?
Nein. Sie gibt nur Zeitdauern zurück; Überstundengrenzen, Rundung, Lohnsätze und Arbeitsrecht werden in einem anderen Schritt angewendet.
Warum werden überlappende Schichten abgelehnt?
Überlappungen würden dieselbe Zeit doppelt zählen. Die Ablehnung macht den Konflikt sichtbar, statt eine überhöhte Summe zurückzugeben.
Für Entwickler — API-Zugang
Alles auf dieser Seite ist auch per API verfügbar. Dieser Abschnitt richtet sich an Teams, die es in ihre eigenen Systeme einbinden möchten; alle anderen nutzen einfach das Tool oben.
Endpunkt
Authentifizierung per Bearer-Token. Ein einziger POST stellt die Aufgabe in die Warteschlange; das Ergebnis erhalten Sie per Webhook oder über einen signierten Link.
Aufruf aus Ihrem Stack
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)Beispiel-Anfrage
{
"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
}
]
}Beispiel-Antwort
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.timesheet_total",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}Die API arbeitet asynchron: Sie erhalten sofort eine task_id. Polling ist mit 1 Anfrage pro Sekunde erlaubt.
Preis
Der Preis steht auf der Seite – keine Tokens, keine Credits. Fehlgeschlagene Aufgaben werden nicht berechnet.
Limits
max_items | 10000 |
Fehler
| HTTP | Code | Bedeutung |
|---|---|---|
401 | unauthorized | Der API-Schlüssel fehlt oder ist ungültig – prüfen Sie den Authorization-Header (Bearer). |
402 | insufficient_balance | Ihr Guthaben reicht für diese Aufgabe nicht aus – Aufladungen verfallen nicht. |
404 | unknown_type | Unbekannter Aufgabentyp – prüfen Sie das Feld „type“ gegen den Katalog. |
429 | rate_limited | Zu viele Anfragen – warten Sie kurz; Polling ist mit 1 Anfrage pro Sekunde erlaubt. |