我必须节省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 > 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
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的日期和时间基础课程(最后,在"使用范围"中)涵盖了大部分内容.
归档时间: |
|
查看次数: |
2974 次 |
最近记录: |