【问题标题】:Python time comparison at midnight午夜Python时间比较
【发布时间】:2015-05-29 12:18:06
【问题描述】:

我必须以AMPM格式保存时间。

但我无法决定如何输入午夜时间。

假设时间是晚上 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 做,那么我无法比较 9pm > 12am 但 11.59 看起来很奇怪或者可能是正确的方式

【问题讨论】:

  • 据我所知,一天是从上午 12 点到晚上 11.59 点
  • 所以 11.59 没关系,我不知道 59 数字看起来有多尴尬。如果那是人们使用的东西,那么我没问题
  • 要么这样,要么用日期(天)来比较
  • 12:00AM 实际上是任何一天的00:00。这只是人们在一天的第一个小时记录时间的常见方式。也许您应该在内部使用 24 小时制时间,并根据输入和输出的需要将它们转换为 AM/PM 格式。

标签: python datetime


【解决方案1】:

您应该始终使用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
    

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

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

【讨论】:

【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多