Totale ore lavorate al netto delle pause
Il calcolatore del totale delle ore lavorate somma un elenco di registrazioni di entrata e uscita, sottrae la pausa non retribuita indicata per ogni turno e restituisce un totale netto chiaro.
Esegui gratis nel browser
Ogni data e ora ISO deve includere Z oppure uno scostamento esplicito, così i dati di sedi diverse, periodi con ora legale o turni notturni vengono confrontati su un'unica linea temporale UTC. Il risultato mostra anche le ore lorde, i minuti complessivi di pausa e il numero di turni inclusi, agevolando la verifica o l'automazione del calcolo.
Inserisca turni completi e privi di ambiguità
Fornisca una riga per ogni periodo continuativo di lavoro. Ogni riga richiede una data e ora clock_in e una clock_out in formato ISO 8601, con i secondi e Z oppure uno scostamento UTC numerico, ad esempio -04:00. Lo scostamento è indispensabile perché, durante i cambi dell'ora, un orario locale isolato non identifica sempre un istante univoco. Aggiunga break_minutes quando il turno include una pausa non retribuita; ometta il campo se non deve essere applicata alcuna detrazione. Sono ammessi minuti di pausa decimali, utili quando il sistema sorgente registra frazioni di minuto. L'uscita può ricadere nel giorno di calendario successivo, quindi il lavoro notturno non richiede una modalità speciale. Il calcolatore rifiuta date impossibili, scostamenti mancanti, uscite non successive alle entrate, pause negative e pause più lunghe del turno. Rifiuta inoltre i turni sovrapposti dopo la normalizzazione UTC, perché contarli entrambi aumenterebbe il totale senza segnalarlo. Rendere esplicita ogni riga consente di controllare l'input ed evita supposizioni su pause pranzo, regole di arrotondamento o intervalli tra turni da considerare come pausa.
Comprenda come viene eseguito il calcolo UTC
Ogni marca temporale viene interpretata come valore del calendario gregoriano e convertita in una posizione espressa in millisecondi UTC tramite lo scostamento indicato. Il calcolo non consulta il fuso orario del dispositivo, un database dei fusi, la data corrente o servizi esterni. Per ogni riga valida, la durata lorda equivale all'istante UTC di uscita meno quello di entrata. La pausa inserita viene convertita da minuti a millisecondi e sottratta dalla durata lorda di quella riga. Le durate lorde e le pause vengono quindi sommate separatamente prima di produrre il totale netto finale. Questo ordine garantisce risultati stabili per gruppi che utilizzano scostamenti diversi e per turni che superano la mezzanotte. L'output comprende total_hours per il tempo netto lavorato, total_minutes per i sistemi che preferiscono i minuti, gross_hours prima delle detrazioni, break_minutes come detrazione complessiva e shift_count per la riconciliazione. Ore e minuti vengono arrotondati a sei cifre decimali solo nell'output; l'accumulo interno resta in millisecondi interi. Gli stessi input producono quindi lo stesso JSON indipendentemente dalla lingua del browser o dalla posizione del server.
Utilizzi il risultato per paghe e rendicontazione
I campi restituiti separano l'attività originaria dalla durata finale retribuibile, consentendo a chi verifica di riprodurre il calcolo. Confronti shift_count con il numero di righe importate, gross_hours con l'intervallo lordo delle timbrature e break_minutes con le detrazioni non retribuite previste prima di accettare total_hours. La capacità non applica fasce di straordinario, regole sulle pause retribuite, tariffe salariali, tolleranze d'orario o arrotondamenti specifici dell'azienda. Tali criteri cambiano in base al contratto e alla giurisdizione e devono essere applicati in un passaggio successivo ben documentato. Non deduce neppure le pause dagli spazi tra righe separate: vengono sottratti esclusivamente i valori break_minutes forniti da Lei. La funzione è quindi un componente deterministico per preparare paghe, fatture di collaboratori, rapporti di progetto e riconciliazioni delle presenze senza incorporare criteri nascosti. Può eseguirla gratuitamente nel browser per un controllo individuale, mentre l'automazione tramite API costa $0.002 per richiesta. Per importazioni ripetibili, conservi le stringhe ISO e gli scostamenti originali insieme al riepilogo, affinché ogni totale contestato possa essere ricondotto agli istanti e alle detrazioni esatti.
Casi d'uso
Preparare un totale per le paghe
Combini turni approvati e pause non retribuite in una durata netta prima di applicare tariffe o regole sugli straordinari.
Verificare la fattura di un collaboratore
Ricalcoli il tempo fatturato dalle registrazioni senza dipendere dal fuso orario locale di chi effettua il controllo.
Riconciliare le esportazioni delle presenze
Confronti tempo lordo, detrazioni e numero di turni con i dati esportati da un sistema di timbratura.
Domande frequenti
Quanto costa una richiesta?
L'automazione tramite API costa $0.002 per richiesta e il calcolo può anche essere eseguito gratuitamente nel browser.
Quale formato di data e ora è richiesto?
Utilizzi ISO 8601 con data, ora fino ai secondi e Z oppure uno scostamento esplicito, ad esempio 2026-07-20T09:00:00-04:00.
Come si indicano le pause?
Imposti break_minutes in ogni turno con la durata della pausa non retribuita. Se lo omette, la detrazione per quel turno è zero.
Calcola gli straordinari o le retribuzioni?
No. Restituisce solo durate; soglie degli straordinari, arrotondamenti, tariffe e norme sul lavoro richiedono un altro passaggio.
Perché i turni sovrapposti vengono rifiutati?
Gli intervalli sovrapposti conterebbero due volte lo stesso tempo. Il rifiuto evidenzia il conflitto invece di produrre un totale gonfiato.
Per sviluppatori — accesso via API
Tutto quello che vedi in questa pagina è disponibile anche via API. Questa sezione è per i team che vogliono integrarlo nei propri sistemi; chi non ne ha bisogno può semplicemente usare lo strumento qui sopra.
Endpoint
Autenticazione con Bearer token: un POST mette in coda l'attività e il risultato arriva via webhook o link firmato.
Chiamala dal tuo 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)Esempio di richiesta
{
"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
}
]
}Esempio di risposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "date.timesheet_total",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}L'API è asincrona: ricevi subito un task_id e puoi fare polling fino a 1 richiesta al secondo.
Prezzi
Prezzo pubblicato, senza token né crediti. Se l'attività fallisce, non paghi.
Limiti
max_items | 10000 |
Errori
| HTTP | Codice | Significato |
|---|---|---|
401 | unauthorized | Chiave API mancante o non valida: controlla l'header Authorization. |
402 | insufficient_balance | Credito esaurito: ricarica per continuare a eseguire attività. |
404 | unknown_type | Tipo di attività sconosciuto: controlla il campo type della richiesta. |
429 | rate_limited | Troppe richieste in poco tempo: rallenta e riprova tra qualche secondo. |