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