如何在向日期时间添加小时时自然滚动到下一天
我有一些代码需要处理从文件中读取的日期。比如说,把11:50调整到12:00,以便让数字看起来更整齐。目前我用的方式大概是这样的:
end = end.replace(hour = end.hour + 1, minute = 0)
但是如果end.hour
是晚上11点,就会出现问题,因为这会转到第二天。你可以用这样的代码来防止这个问题...
if end.hour == 23:
end = end.replace(day = end.day + 1, hour = 0, minute = 0)
else:
end = end.replace(hour= end.hour + 1, minute=0)
但如果那一天是这个月的最后一天呢?那你就需要转到下个月,依此类推。
肯定有更简单的方法来处理这个问题。你是怎么处理日期调整的,同时又能考虑到转到下一天、下个月或下一年呢?
2 个回答
1
如果你想把时间四舍五入到下一个整点(也就是分钟数变成0),你可以使用dateutil这个库,方法如下:
import datetime as DT
import dateutil.rrule as rrule
def next_hour(date):
rr = rrule.rrule(rrule.HOURLY, byminute=[0], dtstart=date, count=1)
return rr.after(date, inc=True)
print(next_hour(DT.datetime(2000,1,31,11,50)))
# 2000-01-31 12:00:00
print(next_hour(DT.datetime(2000,1,31,12,0)))
# 2000-01-31 12:00:00
print(next_hour(DT.datetime(2000,1,31,23,50)))
# 2000-02-01 00:00:00
3
与其使用 datetime.replace()
,不如使用一个 timedelta()
对象,把它加到你的 datetime
对象上:
end += timedelta(hours=1)
这样可以自动处理日期的变化:
>>> from datetime import datetime, timedelta
>>> end = datetime(2014, 9, 1, 22, 45)
>>> end += timedelta(hours=1)
>>> end
datetime.datetime(2014, 9, 1, 23, 45)
>>> end += timedelta(hours=1)
>>> end
datetime.datetime(2014, 9, 2, 0, 45)
当然,这也适用于增加月份和年份:
>>> last_day = datetime(2014, 12, 31, 23, 45)
>>> last_day + timedelta(hours=1)
datetime.datetime(2015, 1, 1, 0, 45)