如何将表示时间范围的字符串转换为 struct_time 对象?

How to convert a string representing a time range into a struct_time object?

您可以使用 strptime 方法在 Python 中解析表示时间的字符串。 Whosebug 上有许多工作示例:

Converting string into datetime

但是,如果您的字符串表示时间 范围,而不是特定时间怎么办?您如何使用 strptime 方法解析字符串?

例如,假设您让用户输入开始和结束时间。

studyTime = input("Please enter your study period (start time – finish time)")

您可以提示甚至强制用户以特定格式输入时间。

studyTime = input("Please enter your study period (hh:mm - hh:mm): ")

假设用户输入 03:00 PM – 05:00 PM。我们如何使用 strptime 解析这个字符串?

formatTime = datetime.datetime.strptime(studyTime, "%I:%M %p")

上面的 formatTime 只适用于单个时间,即 03:00 下午,而不是开始 – 结束时间,03:00 – 05:00。以下将意味着格式数据过多,并且将引发 ValueError

formatTime = datetime.datetime.strptime(studyTime, “%I:%M %p - %I:%M %p”)

当然还有其他选择,例如将开始时间和结束时间作为单独的字符串。但是,我的问题是具体的,是否有一种方法可以使用类似于下面的方法来解析一个包含多个时间表示的字符串。

formatTime = datetime.datetime.strptime(studyTime, “%I:%M %p - %I:%M %p”)

strptime() 只能解析单个日期时间字符串表示.

您必须将输入字符串拆分为 - 并使用 strptime():

加载每个项目
>>> from datetime import datetime
>>>
>>> s = "03:00 PM - 05:00 PM"
>>> [datetime.strptime(item, "%I:%M %p") for item in s.split(" - ")]
[datetime.datetime(1900, 1, 1, 15, 0), datetime.datetime(1900, 1, 1, 17, 0)]

还检查了流行的 third-parties:dateutildeloreanarrow - 不要认为它们提供日期时间范围解析功能。 dateutil 的 fuzzy_with_tokens() 看起来很有希望,但它正在抛出错误:

>>> from dateutil.parser import parse
>>> s = "03:00 PM - 05:00 PM"
>>> parse(s, fuzzy_with_tokens=True)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/dateutil/parser.py", line 1008, in parse
    return DEFAULTPARSER.parse(timestr, **kwargs)
  File "/Users/user/.virtualenvs/so/lib/python2.7/site-packages/dateutil/parser.py", line 390, in parse
    res, skipped_tokens = self._parse(timestr, **kwargs)
TypeError: 'NoneType' object is not iterable

这可能意味着它也不应该解析多个日期时间。