I'd like to convert a number of milliseconds to a formatted string using Python's datetime.
def milliseconds_to_str(t):
"""Converts the number of milliseconds to HH:MM:SS,ms time"""
return str(datetime.timedelta(milliseconds=t)).replace('.', ',')[:-3]
The above works extremely well, for example:
> milliseconds_to_str(8712313): '2:25:12,313'
The problem arises when the number of milliseconds is an even multiple of 1000, for example:
milliseconds_to_srt_time(1000) > 0:00 (Should be 0:00:01,000)
milliseconds_to_srt_time(1000000) > 0:16 (Should be 0:16:00,000)
milliseconds_to_srt_time(4000400) > 1:06:40,400 (GOOD)
milliseconds_to_srt_time(80808231) > 22:26:48,231 (GOOD)
milliseconds_to_srt_time(80808000) > 22:26 (Should be 22:26:00,000)
How can I avoid this rounding?
CodePudding user response:
Using a fixed slicing of [:-3]
wouldn't work because the resulting string of the milliseconds varies.
2:25:12.313000
0:00:01
Here, it will only be applicable to the 1st (where the last 000
would be trimmed resulting to 2:25:12.313
) but should not be applied on the 2nd (as that would remove :01
resulting to 0:00
).
Instead, we can just append a ".000"
first and then trim the milliseconds part (which is after the dot .
) to the first 3 characters [:3]
.
import datetime
def milliseconds_to_srt_time(t):
"""Converts the number of milliseconds to HH:MM:SS,ms time"""
time_str = str(datetime.timedelta(milliseconds=t)) ".000"
time_str_split = time_str.split(".", maxsplit=1)
return f"{time_str_split[0]},{time_str_split[1][:3]}"
print(milliseconds_to_srt_time(8712313))
print(milliseconds_to_srt_time(1000))
print(milliseconds_to_srt_time(1000000))
print(milliseconds_to_srt_time(4000400))
print(milliseconds_to_srt_time(80808231))
print(milliseconds_to_srt_time(80808000))
Output
2:25:12,313
0:00:01,000
0:16:40,000
1:06:40,400
22:26:48,231
22:26:48,000
CodePudding user response:
Here is another exemple of implementation, very similar though.
You can find other usefull information here : Format timedelta to string
import datetime
def milliseconds_to_str(t):
"""Converts the number of milliseconds to HH:MM:SS,ms time"""
d = str(datetime.timedelta(milliseconds=t)).split(".")
out = ":".join(["d" % (int(float(x))) for x in d[0].split(':')])
return out "," ("%d" % (int(d[1])/1000) if len(d)==2 else "000")
print(milliseconds_to_str(8712313))
print(milliseconds_to_str(1000))
print(milliseconds_to_str(1000000))
print(milliseconds_to_str(4000400))
print(milliseconds_to_str(80808231))
print(milliseconds_to_str(80808000))
The output is the same as Niel gave.