2013-06-22 41 views
1

我已经看到了希望一样,除了在我的情况的时间格式并不总是HH几个问题:MM:SS,有时它只是MM:SS另一个转换为hh:mm:ss的以秒

我了解这里提到How to convert an H:MM:SS time string to seconds in Python?这里Python Time conversion h:m:s to seconds

我不明白的是如何处理类似情况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个单一功能。

+1

...这是真的吗? –

+0

现在它给了我一个IndexError:列表索引超出范围,所以我期望代码getSec有问题。 – user1987032

回答

6
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 
+0

谢谢,这有助于我更好地理解它。 – user1987032

1

这对于所有时间格式来说都差不多。退房datetime模块:

>>> 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是秒。列表可以发现here


作为一个功能:

>>> 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 
+0

好的,我会看看它,谢谢。我现在的问题是,用当前代码我得到一个IndexError:列表索引超出范围,我认为这是因为它期望h:m:s而不是给定的m:s? – user1987032

+0

@ user1987032当前的代码?请在您的问题中张贴 – TerryA

+0

@ user1987032我编辑了我的答案。这有帮助吗? – TerryA

0

的最新版本(只是承诺; 0.3.0对pypi)的simple-date扩展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语法]

相关问题