午夜的Python时间比较

use*_*546 1 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()
Run Code Online (Sandbox Code Playgroud)

现在我想知道t2是否应该是

12:00 AM 要么 11.59PM

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

Mat*_*int 5

你应该总是用00:00(或12:00 AM)代表午夜.

使用23:59(或11:59 PM)是有问题的,原因有两个:

  • 精确度在比较中很重要.是23:59:01不是在午夜之前?怎么样23:59:59.9999

  • 无论您选择何种精度,持续时间计算都会被抛弃.考虑10:00 pm到午夜是2小时,而不是1小时59分钟.

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

现在关于越过午夜边界:

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

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

    [21:00, 06:00) = 9 hours
     21:00 < 06:00  OR  21:00 > 06:00
    
    Run Code Online (Sandbox Code Playgroud)

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

    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.
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    if (start <= end)
        duration = end - start
    else
        duration = end - start + 24_hours
    
    Run Code Online (Sandbox Code Playgroud)

    或者更简单:

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

    if (start <= end)
        is_between = start <= value AND end > value
    else
        is_between = start <= value OR  end > value
    
    Run Code Online (Sandbox Code Playgroud)

请注意,在上面的伪代码中,我指的是数值的大小,与数字相比 - 而不是逻辑时间值,如前所述,如果没有参考日期,则不能独立地进行比较.

此外,我的关于Pluralsight的日期和时间基础课程(最后,在"使用范围"中)涵盖了大部分内容.