2016-12-25 40 views
1

我试图将时间持续时间(例如字符串为“3h30m”)转换为单独的小时和分钟组件。我想允许小时大于23个获取带小时数> 24的时间

time.strptime("3h30m", "%Hh%Mm") 

以上回报time.struct_time其中tm_hour=3tm_min=30

如果我尝试:

time.strptime("25h30m", "%Hh%Mm") 

我得到一个ValueError。是否可以运行以上并获得tm_hour=25

+0

是不是23小时的最大价值? – Psidom

+0

@Psidom我不希望它成为 – theonlygusti

+0

不,作为解释:'%H':\t“小时(24小时制)作为零填充十进制数00,01,...,23” https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior – DeepSpace

回答

0

我没有最终使用正则表达式:

def parse_time_span(time_string): 
    """Convert an inputted string representing a timespan, like 3h30m15s, into a duration in seconds.""" 
    pattern = re.compile(r"^(?:(?P<hours>\d+)h)?(?:(?P<minutes>\d+)m)?(?:(?P<seconds>\d+)s)?$") 
    (hours, minutes, seconds) = pattern.match(time_string).groups() 
    hours = 0 if hours is None else int(hours) 
    minutes = 0 if minutes is None else int(minutes) 
    seconds = 0 if seconds is None else int(seconds) 
    total_seconds = datetime.timedelta(hours=hours, minutes=minutes, seconds=seconds).total_seconds() 
    return round(total_seconds) 
-1

仅仅因为你想要它并不意味着它可能在这个框架中。正如@Psidom所说,你需要做的工作来解析你所关心的。

您小时的正则表达式是:

[0-9]*h 

和分钟:

[0-9]*m 

PY中使用正则表达式可以发现here

+0

如果您打算投票,请提供意见。 –

0

不,您不能使用time.strptime()%H只能表示0到23之间的数字。时间元组格式不支持tm_hour值> 23。

你可以使用正则表达式来代替:

import re 

def parse_time(inputtext, _pattern=re.compile(r'(?:(\d+)h)?([0-5]\d)m')): 
    try: 
     hours, minutes = _pattern.search(inputtext).groups() 
    except AttributeError: 
     raise ValueError('Not a valid time string') 
    return int(hours or 0), int(minutes) 

上面的图案适用于任何小时和分钟的组合,以分钟到59小时,并无限制(并省略通通工作太)。

>>> parse_time('25h82m') # invalid 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 5, in parse_time 
ValueError: Not a valid time string 
>>> parse_time('25h30m') # valid 
(25, 30) 
>>> parse_time('3h30m') # valid 
(3, 30) 
>>> parse_time('30m') # valid 
(0, 30)