处理日期时间值溢出的最佳方法是什么

What is the best way to handle datetime value overflow

我正在尝试构建一个程序来处理警报。我希望它能够处理特定日期,如 8/23/2015 7:00 和相对日期,如从现在起 5 天零 7 小时。具体日期没问题,但对于相对日期,如果我尝试将日期时间增加 5 天 7 小时,它可能会溢出该地点的预期值

import datetime
dt = datetime.datetime.now()
dayslater = 5
hourslater = 7
minuteslater = 30
alarmTime = datetime.datetime(dt.year, dt.month, dt.day + dayslater,
                              dt.hour + hourslater,
                              dt.minute + minuteslater, 0,0)

这有时很好,但如果 dayslater 是 40 天,它会溢出该值。我确实设置了一个简单的

if hours >= 24: 
    hours -= 24
    days++

然而,这不适用于天数不一致的溢出月份。

使用 datetime.timedelta() object 并将计算留给 datetime 库:

import datetime

delta = datetime.timedelta(days=dayslater, hours=hourslater, minutes=minuteslater)
alarmTime = datetime.datetime.now() + delta

演示:

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dayslater = 5
>>> hourslater = 7
>>> minuteslater = 30
>>> delta = datetime.timedelta(days=dayslater, hours=hourslater, minutes=minuteslater)
>>> delta
datetime.timedelta(5, 27000)
>>> dt
datetime.datetime(2015, 7, 23, 21, 4, 59, 987926)
>>> dt + delta
datetime.datetime(2015, 7, 29, 4, 34, 59, 987926)

请注意小时数如何延续到第二天(从 21:04 到 04:34),因此日期从 23 日变成了 29 日。我在这里不必担心 'overflow'。

这在月边界、年边界和闰年继续有效,2 月 29 日:

>>> datetime.datetime(2015, 7, 26, 22, 42) + delta
datetime.datetime(2015, 8, 1, 6, 12)
>>> datetime.datetime(2015, 12, 26, 22, 42) + delta
datetime.datetime(2016, 1, 1, 6, 12)
>>> datetime.datetime(2016, 2, 23, 22, 42) + delta
datetime.datetime(2016, 2, 29, 6, 12)

不要。 Dates are hard,而且很容易写错

而是使用 timedelta:

In [1]: from datetime import datetime, timedelta

In [2]: dt = datetime.now()

In [3]: dt
Out[3]: datetime.datetime(2015, 7, 23, 15, 2, 55, 836914)

In [4]: alarmTime = dt + timedelta(days=5, hours=7, minutes=30)

In [5]: alarmTime
Out[5]: datetime.datetime(2015, 7, 28, 22, 32, 55, 836914)