【问题标题】:Is there a way i can use datetime to convert a string to milliseconds without using timedelta?有没有一种方法可以在不使用 timedelta 的情况下使用 datetime 将字符串转换为毫秒?
【发布时间】:2020-06-03 23:34:24
【问题描述】:

我正在尝试将包含时间 ("%H:%M:%S.%f") 的字符串转换为等效毫秒的 int。复杂的是,时间是 FFmpeg 的输出,它是音频文件中的一个点。我需要获取字符串中时间所代表的毫秒数。 DateTime 中的时间戳方法是从纪元开始的毫秒数,从我开始时没有另一个时间戳,这不好。

例如: t = "00:05:52.654321" 应转换为: i = 352654321

最好的方法是什么?

这就是我想出的方法。

def _convert_string_to_int(self, s) -> int:
    begin = datetime.datetime(1900,1,1)
    end = datetime.datetime.strptime(s, self._ffmpeg_format_string)
    return int((end - begin).total_seconds() * 1000000)

感觉真的没必要像那样使用 timedelta。

【问题讨论】:

    标签: python-3.x datetime timedelta


    【解决方案1】:

    由于时间戳与 Unix 纪元 (1970-01-01) 相关,因此您可以通过将日期添加到它的前面来创建一个 datetime 对象,然后获取结果对象的时间戳以将时间字符串转换为秒.由于 python 时间戳是自纪元以来秒数的浮点表示,因此您需要乘以 1000 并转换为整数以获得毫秒数:

    from datetime import datetime
    
    t = "00:05:52.654321"
    d = datetime.strptime('1970-01-01 ' + t, '%Y-%m-%d %H:%M:%S.%f')
    print(int(d.timestamp()*1000))
    

    输出:

    352654
    

    如果您真的想要微秒,请乘以 1000000

    作为替代方案,您可以拆分: 上的时间字符串并对各部分求和,然后乘以603600 将小时和分钟部分转换为秒:

    t = "00:05:52.654321"
    
    millisecs = int(sum([float(v) * 1000 * 60 ** (2 - i) for i, v in enumerate(t.split(':'))]))
    print(millisecs)
    

    输出:

    352654
    

    同样,如果您想要微秒,只需乘以 1000000 而不是 1000

    【讨论】:

      【解决方案2】:

      毫秒数本质上是一个时间间隔,因此datetime.timedelta 实例有一个total_seconds 方法而datetime.datetimedatetime.datedatetime.time 没有这是有充分理由的有一个。

      原则上,您可以使用datetime.datetime.time(end) 来获取具有包括hourminutesecondmicrosecond 在内的属性的对象,然后使用这些来构造一个算术表达式,以表示从午夜开始经过的时间同一天。但是,像这样处理时间间隔的受支持方法正是您已经在使用的 timedelta 方法。

      【讨论】:

      • 非常感谢您的解释!我想下一个问题是有没有比日期时间更适合我的情况的模块?再次感谢您的回复!
      猜你喜欢
      • 2016-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-21
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多