我的问题与此question类似,但在UTC日期时间做timedelta对我来说不是一个选项。
我有一个功能,可以评估每个人类日的时间段,从午夜到午夜。这意味着在英国,例如,有两天分别为23和25小时。它的工作原理如下:
import datetime
import pytz
start_dt = datetime.datetime(2016, 3, 27, 0, 0, 0, 0)
localtz = pytz.timezone('Europe/London')
start_dt = localtz.localize(start_dt)
print start_dt
end_dt = start_dt + datetime.timedelta(days=1)
print end_dt
print (end_dt - start_dt).total_seconds()
在上面的代码段 end_dt 评估为2016-03-28 00:00:00 + 00:00,timedelta为86400.难道不是2016-03-28 00 :00:00 + 01:00和82800?
我已经看过帖子说使用pytz函数normalize()来规范化' end_dt,但它只会产生2016-03-28 01:00:00 + 01:00的结束日期
答案 0 :(得分:1)
添加25小时,然后重置时间。如果时间总是午夜到午夜,但在一天中的其他时间可能会失败,则此方法有效。
end_dt = start_dt + datetime.timedelta(hours=25)
end_dt = end_dt.replace(hour=0, minute=0, second=0)
更强大的解决方案使用中午到中午的计算并在之后替换时间。这应适用于一天中的任何时间和任何时区规则,并允许任意数天(甚至是负数)。
def add_days(start_dt, days):
end_dt = start_dt.replace(hour=12, minute=0) + datetime.timedelta(days=days)
return end_dt.replace(hour=start_dt.hour, minute=start_dt.minute)