Overview
Enter one or more shifts - each with a start time, end time, and break length in minutes - to calculate total hours worked across all of them. Each row's shift length is computed as plain clock-time arithmetic in minutes-since-midnight (end minus start), with an overnight adjustment (adding 24 hours worth of minutes) applied only when the end time is earlier than the start time, such as a shift running from 22:00 to 06:00. This deliberately avoids using JavaScript Date objects across day boundaries, which would introduce timezone or daylight-saving effects into what should be pure time-of-day math with no calendar or timezone involved. Rows can be added or removed freely, an empty row is simply skipped (contributing zero), and a break longer than the shift itself is rejected with a clear message rather than producing a negative total. Useful for freelancers, hourly employees, or anyone manually reconciling a week of shifts against a timesheet. Runs entirely client-side.
Best for: Adding up total hours worked across a week of shifts, each with its own start, end, and break
How to use this tool
- Enter each shift's start and end time. In 24-hour HH:MM format, plus the break length in minutes for that shift.
- Add or remove rows as needed. One row per shift - add more for additional days, or remove rows you don't need.
- Read the total. All valid rows' worked time (shift length minus break) summed together.
Frequently asked questions
When the end time is earlier than the start time, the calculator treats it as an overnight shift and adds 24 hours worth of minutes before subtracting - so 22:00 to 06:00 correctly computes as 8 hours, not a negative number. This is done with plain minutes-since-midnight arithmetic, not Date objects, so there's no timezone or daylight-saving effect.
That row is rejected with a clear error message, since a break can't exceed the total length of the shift it's subtracted from - allowing it would silently produce a negative worked time for that row.
An empty row (no start or end time entered) is treated as zero worked time and simply doesn't contribute to the total, rather than being flagged as an error - useful for leaving spare rows in place for days you haven't filled in yet.