Total des heures travaillées moins les pauses
Le calculateur de total d'heures additionne une liste de pointages d'entrée et de sortie, retranche la pause non rémunérée indiquée pour chaque service et fournit un total net lisible.
Lancer gratuitement
Chaque date-heure ISO doit comporter Z ou un décalage explicite : les relevés de bureaux différents, de périodes de changement d'heure ou de services de nuit sont ainsi comparés sur une même chronologie UTC. Le résultat indique également les heures brutes, le total des minutes de pause et le nombre de services pris en compte, ce qui facilite le contrôle ou l'automatisation du calcul.
Saisissez des services complets et sans ambiguïté
Fournissez une ligne pour chaque période de travail continue. Chaque ligne doit contenir une date-heure clock_in et une date-heure clock_out au format ISO 8601, avec les secondes et soit Z, soit un décalage UTC numérique tel que -04:00. Le décalage est indispensable, car une heure locale seule ne désigne pas toujours un instant unique lors des changements d'heure. Ajoutez break_minutes lorsqu'un service comprend une pause non rémunérée ; omettez ce champ lorsqu'aucune pause ne doit être déduite. Les fractions de minute sont acceptées, ce qui convient aux systèmes sources enregistrant des durées précises. La sortie peut se situer le jour civil suivant : aucun mode particulier n'est donc nécessaire pour le travail de nuit. Le calculateur refuse les dates impossibles, les décalages absents, une sortie qui n'est pas postérieure à l'entrée, les pauses négatives et celles qui dépassent la durée du service. Il refuse aussi les services qui se chevauchent après normalisation en UTC, car leur double comptage gonflerait discrètement le total. Des lignes explicites rendent les données vérifiables et évitent toute supposition sur les pauses-repas, les arrondis ou les intervalles à considérer comme pauses.
Comprenez le calcul effectué en UTC
Chaque horodatage est interprété comme une valeur du calendrier grégorien, puis converti en une position exprimée en millisecondes UTC grâce au décalage fourni. Le calcul ne consulte ni le fuseau horaire de l'appareil, ni une base de données de fuseaux, ni la date actuelle, ni un service externe. Pour chaque ligne valide, la durée brute correspond à l'instant UTC de sortie moins l'instant UTC d'entrée. La pause déclarée est convertie de minutes en millisecondes, puis retranchée de la durée brute de la ligne. Toutes les durées brutes et toutes les pauses sont ensuite additionnées séparément avant la production du total net. Cette méthode donne des résultats stables lorsque les relevés d'une équipe utilisent des décalages différents ou qu'un service traverse minuit. La sortie comprend total_hours pour le temps net travaillé, total_minutes pour les systèmes utilisant les minutes, gross_hours avant déduction, break_minutes pour la déduction cumulée et shift_count pour le rapprochement. Les heures et minutes ne sont arrondies à six décimales qu'au moment de produire la réponse ; le cumul interne reste en millisecondes entières. Les mêmes données génèrent donc le même JSON, quels que soient la langue du navigateur et l'emplacement du serveur.
Intégrez le résultat aux paies et aux rapports
Les champs renvoyés distinguent les pointages sources de la durée finale rémunérable, afin qu'une personne chargée du contrôle puisse refaire le calcul. Comparez shift_count au nombre de lignes importées, gross_hours à l'amplitude brute des pointages et break_minutes aux pauses non rémunérées attendues avant de valider total_hours. Cette capacité n'applique ni tranches d'heures supplémentaires, ni règles sur les pauses payées, ni taux de rémunération, ni tolérances d'horaire, ni arrondis propres à une entreprise. Ces politiques dépendent des accords et des juridictions ; appliquez-les dans une étape ultérieure clairement documentée. Le calculateur ne déduit pas non plus de pauses à partir des espaces entre deux lignes : seuls les break_minutes que vous fournissez sont retranchés. La fonction constitue ainsi une brique déterministe pour préparer des paies, contrôler des factures de prestataires, produire des relevés de projet ou rapprocher des présences sans règle cachée. Vous pouvez l'utiliser gratuitement dans le navigateur pour un contrôle ponctuel ; l'automatisation par API coûte $0.002 par requête. Pour des imports reproductibles, conservez les chaînes ISO et leurs décalages d'origine avec le récapitulatif, afin de rattacher tout total contesté aux instants et aux déductions exacts.
Cas d’usage
Préparer un total de paie
Regroupez les services validés et les pauses non rémunérées en une durée nette avant d'appliquer les taux ou les règles d'heures supplémentaires.
Contrôler une facture de prestataire
Recalculez le temps facturé à partir des horodatages sans dépendre du fuseau horaire local de la personne qui vérifie.
Rapprocher un export de présence
Comparez le temps brut, les déductions et le nombre de services aux relevés exportés par un système de pointage.
Questions fréquentes
Combien coûte une requête ?
L'automatisation par API coûte $0.002 par requête, et le calcul peut aussi être exécuté gratuitement dans le navigateur.
Quel format de date-heure faut-il utiliser ?
Utilisez ISO 8601 avec la date, l'heure jusqu'aux secondes et Z ou un décalage explicite, par exemple 2026-07-20T09:00:00-04:00.
Comment faut-il indiquer les pauses ?
Renseignez break_minutes sur chaque service avec la durée de la pause non rémunérée. Si le champ est omis, aucune pause n'est déduite de ce service.
Le calcul inclut-il les heures supplémentaires ou les salaires ?
Non. Il fournit uniquement des durées ; les seuils, les arrondis, les taux et le droit du travail relèvent d'une autre étape.
Pourquoi les services qui se chevauchent sont-ils refusés ?
Un chevauchement compterait deux fois la même période. Le refus signale le conflit au lieu de fournir un total artificiellement élevé.
Pour les développeurs — accès API
Tout sur cette page est disponible par programmation. Cette section s'adresse aux équipes qui veulent l'intégrer à leurs systèmes ; les autres peuvent simplement utiliser l'outil ci-dessus.
Endpoint
Authentification par jeton Bearer : un seul POST met la tâche en file d’attente, et le résultat vous parvient par webhook ou lien signé.
Appeler depuis votre 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)Exemple de requête
{
"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
}
]
}Exemple de réponse
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.timesheet_total",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L’API est asynchrone : chaque appel renvoie un task_id immédiatement, puis vous interrogez l’état à raison d’une requête par seconde.
Tarifs
Le prix est publié, sans tokens ni crédits. Une tâche qui échoue n’est pas facturée.
Limites
max_items | 10000 |
Erreurs
| HTTP | Code | Signification |
|---|---|---|
401 | unauthorized | Clé API absente ou invalide : vérifiez l’en-tête Authorization. |
402 | insufficient_balance | Solde insuffisant : rechargez votre compte pour lancer cette tâche. |
404 | unknown_type | Type de tâche inconnu : vérifiez le champ type de votre requête. |
429 | rate_limited | Trop de requêtes : ralentissez la cadence, puis réessayez. |