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