Python 具有相同时区但不同utcoffset()的Datetime对象

Python 具有相同时区但不同utcoffset()的Datetime对象,python,django,datetime,Python,Django,Datetime,在django应用程序中,我面对两个datetime对象(self.dueDate是一个日期对象): 我将它们构造为具有相同的时区(它们具有相同的时区),但它们最终具有两个不同的UTC偏移量 >>>print threshold, threshold.tzinfo 2015-03-13 12:08:00+00:50 Europe/Rome >>>print ref_time, ref_time.tzinfo 2015-03-13 12:48:29.37298

在django应用程序中,我面对两个datetime对象(self.dueDate是一个日期对象):

我将它们构造为具有相同的时区(它们具有相同的时区),但它们最终具有两个不同的UTC偏移量

>>>print threshold, threshold.tzinfo
2015-03-13 12:08:00+00:50 Europe/Rome 
>>>print ref_time, ref_time.tzinfo
2015-03-13 12:48:29.372984+01:00 Europe/Rome

为什么会这样?同一个tz怎么会有两个不同的偏移?(为什么可能是50分钟?

一个时区在不同的时间可能有不同的utc偏移量<代码>时间(tzinfo=tz)使用默认utc偏移量,例如,最早的日期很可能不是您想要的。见:

要将
tz
时区中的当前时间作为感知日期时间对象获取,请执行以下操作:

from datetime import datetime

ref_time = datetime.now(tz)
from datetime import time as datetime_time, timedelta
from django.utils import timezone

midnight_yesterday = datetime.combine(self.dueDate, datetime_time()) - timedelta(1)
threshold = timezone.make_aware(midnight_yesterday)
要在
self.dueDate
的前一天获得午夜作为aware datetime对象,请执行以下操作:

from datetime import datetime

ref_time = datetime.now(tz)
from datetime import time as datetime_time, timedelta
from django.utils import timezone

midnight_yesterday = datetime.combine(self.dueDate, datetime_time()) - timedelta(1)
threshold = timezone.make_aware(midnight_yesterday)

注意:
threshold
可能超过/少于24小时,请参阅。

无关:确保您知道使用时区表示感谢与感谢之间的区别。make_aware()而不是设置tzinfo。你救了我一天@pnjun:如果执行可能跨越DST边界的日期时间算法,请小心
make_aware()
along无法解决此问题,例如,如果您恰好在24小时前需要,则需要另一个代码。请参阅答案中的最后一个链接。