Python:如何在处理暧昧的日子(23和25小时)时将天数添加到本地化日期时间

时间:2016-06-20 15:28:09

标签: python datetime pytz normalize

我的问题与此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的结束日期

1 个答案:

答案 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)