4

我已经看到了一些想要相同的问题,除了在我的情况下时间格式并不总是 hh:mm:ss,有时它只是 mm:ss

我理解这里提到的想法How to convert an H:MM:SS time string to seconds in Python? 在这里Python 时间转换 h:m:s 到秒

我不明白的是如何处理 hh:mm:ss、h:mm:ss、mm:ss 或 m:ss 等情况

def getSec(s):
    l = s.split(':')
    return int(l[0]) * 3600 + int(l[1]) * 60 + int(l[2])

编辑:我认为我的问题不够清楚。我正在寻找一种解决方案来处理具有 1 个单一功能的所有可能格式。

4

3 回答 3

10
def getSec(s):
    l = map(int, s.split(':')) # l = list(map(int, s.split(':'))) in Python 3.x
    return sum(n * sec for n, sec in zip(l[::-1], (1, 60, 3600)))

getSec('20') # 20
getSec('1:20') # 80
getSec('1:30:01') # 5401
于 2013-06-22T07:26:45.050 回答
3

所有时间格式都几乎相同。查看日期时间模块:

>>> s = "15:34:23"
>>> datetime.datetime.strptime(s, "%H:%M:%S")
datetime.datetime(1900, 1, 1, 15, 34, 23)

>>> s = "34:23"  
>>> datetime.datetime.strptime(s, "%M:%S")
datetime.datetime(1900, 1, 1, 0, 34, 23)

>>> s = "4:34"
>>> datetime.datetime.strptime(s, "%M:%S")
datetime.datetime(1900, 1, 1, 0, 4, 34)

%H是小时,%M是分钟,%S是秒。可以在此处找到列表


作为一个函数:

>>> def getSec(s):
...     L = s.split(':')
...     if len(L) == 1:
...             return L[0]
...     elif len(L) == 2:
...             datee = datetime.datetime.strptime(s, "%M:%S")
...             return datee.minute * 60 + datee.second
...     elif len(L) == 3:
...             datee = datetime.datetime.strptime(s, "%H:%M:%S")
...             return datee.hour * 3600 + datee.minute * 60 + datee.second
...
>>> getSec("13:25:43")
48343
>>> getSec("25:43")
1543
>>> getSec("43")
43
于 2013-06-22T07:14:36.777 回答
1

simple-date的最新版本(刚刚提交;pypi上的 0.3.0)使用可选表达式扩展了 Python 的时间格式,有点像正则表达式。所以将只匹配秒,或分钟和秒,或小时,分钟和秒。((H:)?M:)?S

例如:

>>> from simpledate import *
>>> SimpleDate('56', format='((H:)?M:)?S').time
datetime.time(0, 0, 56, tzinfo=<DstTzInfo 'America/Santiago' SMT-1 day, 19:17:00 STD>)
>>> SimpleDate('12:34:56', format='((H:)?M:)?S').time
datetime.time(12, 34, 56, tzinfo=<DstTzInfo 'America/Santiago' SMT-1 day, 19:17:00 STD>)
>>> SimpleDate('34:56', format='((H:)?M:)?S').hour
0
>>> SimpleDate('34:56', format='((H:)?M:)?S').minute
34
>>> SimpleDate('34:56', format='((H:)?M:)?S').second
56

(这America/Santiago部分只是因为那是我的本地时区 - 如果你愿意,你也可以指定一个时区,使用tz='UTC'或类似)

不幸的是,目前不支持总秒数,所以你仍然需要自己做。不过,我会考虑如何添加它。

它类似于正则表达式(其中?表示某些内容是可选的)。您也可以使用(...|...|...).

[更新以反映 0.3 语法]

于 2013-06-22T17:10:29.410 回答