如何在向日期时间添加小时时自然滚动到下一天

0 投票
2 回答
1359 浏览
提问于 2025-04-19 06:04

我有一些代码需要处理从文件中读取的日期。比如说,把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)

撰写回答