我正在尝试构建一个程序来处理警报。我希望它能够处理特定的日期,如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++
然而,这对于数天长度不一致的月份来说是行不通的。
答案 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)