我必须以 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)(最后,在“使用范围”中)。
