# time.duration
Timesheets, job cards and billing notes write durations in a handful of ways.
This reads them, adds them and writes the total back out, in whole minutes, so
one call turns ["1h30m", "45m", "0:15"] into 150 minutes, "2h30m" and "02:30".
A single duration is a list of one.
Accepted forms, with surrounding spaces and upper-case H/M allowed:
- hours and minutes: `1h30m`, `1h 30m`, `2h`, `45m`, `90m`. Minutes alone may
be 60 or more; next to hours they must be under 60, so `1h90m` is an error
(a typo for 1h30m or 1h09m, it cannot be told which).
- clock form: `01:30`, `1:30`, `100:00`, with exactly two minute digits under 60.
Rejected, loudly: a bare number (`90`: minutes or hours?), decimals (`1.5h`:
use 1h30m), negatives, seconds, units in the wrong order (`30m1h`), and any
number over six digits. A duration is a length of time, so it is never
negative.
It deals only in lengths of time. It never reads the clock and knows nothing
about dates, time zones or daylight saving; minutes between two wall-clock
times is time.minutes-between, and billing increments are
time.round-to-increment.
The clock form does not wrap at 24 hours: 25 and a half hours is "25:30",
because a total of work is not a time of day.