5

我有一个字符串列表如下:

4:00-5:00PM
11:00-2:00PM
12:00-1:00PM
11:00-1:00AM

我正在尝试找到一种有效的方法来创建两个时间对象(我想这是跟踪时间范围的唯一方法,稍后我将与日期对象结合使用)。人类很清楚我们所说的 11:00-1:00AM 的意思,但想知道什么是将其转换为的有效方法:

datetime.time(23, 0)
datetime.time(1, 0)

我目前的方法是采用第一次,并创建一个 PM 和 AM 版本,采用 timedelta 和结束时间(已指定),并将两个差异中较短的一个作为正确的。

4

2 回答 2

3

这是一个简单的实现。

    >>> def timeRange(timestr):
    ...     t1, t2 = timestr.split("-")
    ...     timeFormat = "%I:%M%p"
    ...     t1AM = datetime.datetime.strptime(t1 + "AM", timeFormat)
    ...     t1PM = datetime.datetime.strptime(t1 + "PM", timeFormat)
    ...     t2 = datetime.datetime.strptime(t2, timeFormat)
    ...       
    ...     if (t2 - t1AM).seconds < (t2-t1PM).seconds:
    ...         return t1AM.time(), t2.time()
    ...     else:
    ...         return t1PM.time(), t2.time()
    >>> timeRange("11:00-2:00PM")
    (datetime.time(11, 0), datetime.time(14, 0))
    >>> timeRange("4:00-5:00PM")
    (datetime.time(16, 0), datetime.time(17, 0))
    >>> timeRange("11:00-1:00AM")
    (datetime.time(23, 0), datetime.time(1, 0))
    >>> timeRange("11:00-2:00PM")
    (datetime.time(11, 0), datetime.time(14, 0))
    >>> timeRange("12:00-1:00PM")
    (datetime.time(12, 0), datetime.time(13, 0))

这将返回一个time对象,但如果需要,您可以将其滚动到日期时间对象中。

于 2012-07-12T07:38:00.297 回答
2

您的问题中隐含两个假设:

  • 您正在寻找这些时间之间的最短持续时间
  • 第一次是两者中较早的一次。

如果这些假设是正确的,那么快速优化将是:

  • 如果第一个时间大于第二个时间(例如 11:00-1:00AM 或 11:00-1:00PM),则较早的时间是第二个“相反”的 AM/PM 指示符。否则,第一次的 AM/PM 相同。

这甚至适用于最长的时间段,例如 6:00-6:00AM(6:00PM-6:00AM 比 6:00AM-6:00AM 短)

第二个观察是你不能使用简单的时间对象,因为

  • AM->PM 持续时间发生在一天的边界(午夜)上。在这种情况下,这可能会搞砸你的 timedelta 的计算。

因此,我认为您必须使用日期时间,或者将所有这些都包装在一个结构中,该结构表明第一个时间对象中的时间是前一天。

希望这可以帮助 :)

于 2012-07-12T07:35:28.970 回答