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

时间:2015-07-23 20:01:09

标签: python datetime python-datetime

我正在尝试构建一个程序来处理警报。我希望它能够处理特定的日期,如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++

然而,这对于数天长度不一致的月份来说是行不通的。

2 个答案:

答案 0 :(得分:3)

唐'吨。 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)

答案 1 :(得分:2)

使用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日。我不必担心这里的“溢出”。

这在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)