获得数小时的时间> 24

时间:2016-12-25 14:23:23

标签: python python-3.x time

我正在尝试将字符串化为“3h30m”(例如)的持续时间转换为单独的小时和分钟组件。我希望允许小时数大于23

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

以上内容会返回time.struct_time tm_hour=3tm_min=30

如果我尝试:

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

我得到ValueError。是否可以运行上述内容并获得tm_hour=25

3 个答案:

答案 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)

答案 1 :(得分: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)

答案 2 :(得分:-1)

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

你小时的正则表达式是:

[0-9]*h

分钟:

[0-9]*m

在py中使用正则表达式here