Skip to main content
 首页 » 编程设计

午夜Python时间比较

2025年05月04日58linjiqin

我必须以 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 AM 或 11.59PM

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

请您参考如下方法:

您应该始终使用 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 : [开始, 结束)

现在关于穿越午夜边界:

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

    [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 类(class)(最后,在“使用范围”中)。