午夜的Python时间比较

时间:2015-05-29 12:18:06

标签: python datetime

我必须以AM PM格式保存时间。

但是我在决定如何进入午夜时遇到了麻烦。

假设时间是第二天早上9点到6点。我必须把它分成日复一日。喜欢这个

t1 = datetime.datetime.strptime('09:00PM', '%I:%M%p').time()

t2 = datetime.datetime.strptime('12:00AM', '%I:%M%p').time()

t3 = datetime.datetime.strptime('06:00AM', '%I:%M%p').time()

现在我想知道t2应该是

12:00 AM11.59PM

如果我做到12:00 AM那么我无法比较9pm > 12am但是11.59看起来很奇怪或者可能是正确的方式

2 个答案:

答案 0 :(得分:5)

您应始终使用00:00(或12:00 AM)代表午夜。

使用23:59(或11:59 PM)有问题,原因如下:

  • 精确度在比较中很重要。 23:59:01午夜之前不是吗?那么23:59:59.9999呢?

  • 持续时间计算将以您选择的任何精度抛出。考虑10:00 pm到午夜是2小时,而不是1小时59分钟。

为避免这些问题,您应始终将时间间隔视为半开间隔。也就是说,范围具有包含性开始和独占结束。在interval notation[start, end)

现在关于越过午夜边界:

  • 当您比较与日期相关的时间时,您可以直接比较:

    [2015-01-01T21:00,  2015-01-02T06:00) = 9 hours
     2015-01-01T21:00 < 2015-01-02T06:00 
    
  • 如果您没有日期,可以确定持续时间,但无法确定订单!

    [21:00, 06:00) = 9 hours
     21:00 < 06:00  OR  21:00 > 06:00
    

    您可以做的最好的事情是确定时间是否在范围内所涵盖的点之间。

    Both 23:00 and 01:00 are in the range [21:00, 06:00)
    21:00 is also in that range, but 06:00 is NOT.
    

    想一下时钟。它被建模为一个圆圈,而不是一条直线。

  • 要计算可以跨越午夜的仅限时间间隔的持续时间,请使用以下伪代码:

    if (start <= end)
        duration = end - start
    else
        duration = end - start + 24_hours
    

    或更简单:

    duration = (end - start + 24_hours) % 24_hours
    
  • 要确定仅限时间的值是否落在可以跨越午夜的仅限时间的时间间隔内,请使用此伪代码:

    if (start <= end)
        is_between = start <= value AND end > value
    else
        is_between = start <= value OR  end > value
    

请注意,在上面的伪代码中,我指的是数值的幅度,而不是逻辑时间值,如前所述,如果没有参考日期,则无法独立比较

此外,我的Date and Time Fundamentals关于Pluralsight的课程(最后,在“使用范围”中)涵盖了大部分内容。

答案 1 :(得分:0)

如何制作t1 = 09:00PMt2 = 11.59PMt3 = 12:00AMt4 = 06:00AM。那么你每天都有明确的时间范围。当然,添加日期也会使时间差异明显。