代码之家  ›  专栏  ›  技术社区  ›  Andrew

在python中将时间字符串转换为秒

  •  6
  • Andrew  · 技术社区  · 15 年前

    是否有一种好的方法可以将表示时间的字符串转换为秒数,格式为[m h d s w](m=minutes,h=hours,d=days,s=seconds w=week)?即。

    def convert_to_seconds(timeduration):
        ...
    
    convert_to_seconds("1h")
    -> 3600
    
    convert_to_seconds("1d")
    -> 86400
    

    等?

    谢谢!

    4 回复  |  直到 6 年前
        1
  •  14
  •   John Machin Santi    15 年前

    是的,有一个很好的 简单的 在大多数语言中都可以使用的方法 无需阅读日期时间库的手册 . 该方法也可外推至盎司/磅/吨等:

    seconds_per_unit = {"s": 1, "m": 60, "h": 3600, "d": 86400, "w": 604800}
    
    def convert_to_seconds(s):
        return int(s[:-1]) * seconds_per_unit[s[-1]]
    
        2
  •  8
  •   Eli Courtwright    15 年前

    我建议使用 the timedelta class 从日期时间模块:

    from datetime import timedelta
    
    UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"}
    
    def convert_to_seconds(s):
        count = int(s[:-1])
        unit = UNITS[ s[-1] ]
        td = timedelta(**{unit: count})
        return td.seconds + 60 * 60 * 24 * td.days
    

    内部, timedelta 对象以微秒、秒和天的形式存储所有内容。因此,虽然您可以以毫秒、月或年为单位提供参数,但最终您必须 时间增量 您创建并转换回秒。

    万一 ** 语法让你困惑,这是python apply 语法。基本上,这些函数调用都是等价的:

    def f(x, y): pass
    
    f(5, 6)
    f(x=5, y=6)
    f(y=6, x=5)
    
    d = {"x": 5, "y": 6}
    f(**d)
    
        3
  •  0
  •   Michael Gantman    7 年前

    我在Java中编写了一个开源的MGNtutul(不是PHP),它部分地满足了这个需求。它包含一个静态方法 parsingStringToTimeInterval(String value) 此方法分析一个字符串,该字符串应包含一些时间间隔值-一个带可选时间单位后缀的数值。例如,字符串“38s”将被解析为38秒,“24m”-24分钟“4h”-4小时,“3d”-3天,“45”将被解析为45毫秒。支持的后缀是“s”表示秒,“m”表示分钟,“h”表示小时,“d”表示天。不带后缀的字符串被认为以毫秒为单位保存值。后缀不区分大小写。如果提供的字符串包含不支持的后缀,或者包含负数值或零,或者包含非数值,则将引发IllegalArgumentException。此方法返回TimeInterval类-也在此库中定义的类。本质上,它拥有两个具有相关getter和setter的属性:long“value”和java.util.concurrent.timeUnit。但是除了getter和setter之外,这个类还有tomillis()、toseconds()、tominutes()、tohours()todays()方法。这些方法在指定的时间尺度上返回长VLAUE(与类Java.UTI.Orth.TimeUnE中的相应方法相同)。

    此方法对于分析时间间隔属性(如配置文件中的超时或等待时间段)可能非常有用。它消除了从不同时间刻度到毫秒来回不必要的计算。假设您有一个需要设置5天的MethodInvokingInterval属性。因此,为了设置毫秒值,您需要计算出5天是432000000毫秒(显然不是不可能的任务,但很烦人且容易出错),然后任何其他看到432000000值的人都必须将其计算回5天,这是令人沮丧的。但是使用这个方法,您将有一个属性值设置为“5d”并调用代码

    long seconds = TextUtils.parsingStringToTimeInterval("5d").toSeconds();
    

    将解决您的转换问题。显然,这不是过于复杂的特性,但它可以在配置文件中增加简单性和清晰性,并将一些挫折和“愚蠢”的计算错误保存到毫秒级的错误中。以下是介绍mgntuils库以及从何处获取该库的文章的链接: MgntUtils

        4
  •  0
  •   rouble    6 年前

    我通常需要支持原始数字、字符串数字 以[m_h_d_s_w]结尾的字符串编号。

    此版本将处理:10,“10”,“10s”,“10m”,“10h”,“10d”,“10w”。

    给@eli Courtwright的帽子 answer 关于字符串转换。

    UNITS = {"s":"seconds", "m":"minutes", "h":"hours", "d":"days", "w":"weeks"}
    
    def convert_to_seconds(s):
        if isinstance(s, int):
            # We are dealing with a raw number
            return s
    
        try:
            seconds = int(s)
            # We are dealing with an integer string
            return seconds
        except ValueError:
            # We are dealing with some other string or type
            pass
    
        # Expecting a string ending in [m|h|d|s|w]
        count = int(s[:-1])
        unit = UNITS[ s[-1] ]
        td = timedelta(**{unit: count})
        return td.seconds + 60 * 60 * 24 * td.days