如何将类似日期时间的字符串转换为毫秒

how to convert datetime-like string into milliseconds

我有一个用户定义的函数 (return_times),它接受 json 文件和 returns 两个类似日期时间的字符串。

time_1, time_2= return_times("file.json")
print(time_1, time_2) # outputs: 00:00:11.352 00:01:51.936

我所说的类似日期时间的字符串是指适合 '%H:%M:%S.%f' 格式的 00:00:11.352。但是,当我尝试将它们转换为毫秒时,我得到了负值。

from datetime import datetime

dt_obj_1 = datetime.strptime(time_1, '%H:%M:%S.%f')
start_ms = dt_obj_1.timestamp() * 1000

dt_obj_2 = datetime.strptime(time_2, '%H:%M:%S.%f')
end_ms = dt_obj_2.timestamp() * 1000

print(start_ms, end_ms ) # outputs: -2209019260648.0 -2209019160064.0

如果我成功了,我想 trim 使用以下命令制作视频:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip
ffmpeg_extract_subclip("long_video.mp4", start_ms, end_ms, targetname="video_trimmed.mp4"), so just delete ` * 1000` part. 

注意 ffmpeg_extract_subclip 要求其 t1t2 参数以秒为单位,而不是我最初认为的以毫秒为单位。

由于这些负整数,我无法成功 运行 trim 进程。 网上搜了主要讨论年月日几种格式的,没有'%H:%M:%S.%f'.

我可能忽略了什么?

您需要将年份日期(年、月、日)添加到 datetime,否则这将默认为 1900 年 1 月 1 日。

你做的是这样的:

from datetime import datetime
s = "00:00:11.352" 
f = '%H:%M:%S.%f'
datetime.strptime(s, f) # datetime.datetime(1900, 1, 1, 0, 0, 11, 352000)

一种方法是将日期字符串附加到您从 return_times

收到的时间字符串中

您可以将时间字符串拆分为小时、分钟、秒和毫秒,通过一些简单的数学计算,您可以得到以毫秒为单位的整个时间

我可能忽略了什么?

time.strptime 文档

The default values used to fill in any missing data when more accurate values cannot be inferred are (1900, 1, 1, 0, 0, 0, 0, 1, -1).

虽然纪元的开始是 1970 年。您可能会通过计算您解析的内容与默认 strptime 之间的增量来获得您想要的内容,如下所示:

import datetime
time1 = "00:00:11.352"
delta = datetime.datetime.strptime(time1, "%H:%M:%S.%f") - datetime.datetime.strptime("", "")
time_s = delta.total_seconds()
print(time_s)

产出

11.352

来自

The year 1900 was before the beginning of the UNIX epoch, which was in 1970, so the number of seconds returned by timestamp must be negative.

怎么办?

最好使用 time 对象而不是 datetime 对象。

from datetime import time

time_1 = "00:00:11.352"
hours, minutes, seconds = time_1.split(":")

print(time(hour=int(hours), minute=int(minutes), second=int(float(seconds)),
           microsecond=int(float(seconds) % 1 * 1000000)))