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