v0.166.0
 1import datetime
 2
 3
 4def _get_duration_components(
 5    duration: datetime.timedelta,
 6) -> tuple[int, int, int, int, int]:
 7    days = duration.days
 8    seconds = duration.seconds
 9    microseconds = duration.microseconds
10
11    minutes = seconds // 60
12    seconds %= 60
13
14    hours = minutes // 60
15    minutes %= 60
16
17    return days, hours, minutes, seconds, microseconds
18
19
20def duration_string(duration: datetime.timedelta) -> str:
21    """Version of str(timedelta) which is not English specific."""
22    days, hours, minutes, seconds, microseconds = _get_duration_components(duration)
23
24    string = f"{hours:02d}:{minutes:02d}:{seconds:02d}"
25    if days:
26        string = f"{days} " + string
27    if microseconds:
28        string += f".{microseconds:06d}"
29
30    return string
31
32
33def duration_iso_string(duration: datetime.timedelta) -> str:
34    if duration < datetime.timedelta(0):
35        sign = "-"
36        duration *= -1
37    else:
38        sign = ""
39
40    days, hours, minutes, seconds, microseconds = _get_duration_components(duration)
41    ms = f".{microseconds:06d}" if microseconds else ""
42    return f"{sign}P{days}DT{hours:02d}H{minutes:02d}M{seconds:02d}{ms}S"
43
44
45def duration_microseconds(delta: datetime.timedelta) -> int:
46    return (24 * 60 * 60 * delta.days + delta.seconds) * 1000000 + delta.microseconds