我必须用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分钟。
为了避免这些问题,您应该始终将时间间隔视为半开间隔。也就是说,范围有一个包含的开始和一个排除的结束。间隔符号:[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(接近最后,在"使用范围"中)。
如何制作t1 = 09:00PM
, t2 = 11.59PM
, t3 = 12:00AM
和t4 = 06:00AM
。这样你每天就有了明确的时间范围。当然,添加日期也会使时差变得明显。