具有相同时区但不同 utcoffset() 的日期时间对象
Posted
技术标签:
【中文标题】具有相同时区但不同 utcoffset() 的日期时间对象【英文标题】:Datetime object with same timezone but different utcoffset() 【发布时间】:2015-05-16 04:27:15 【问题描述】:在我的 django 应用程序中,我遇到了两个日期时间对象(self.dueDate 是一个日期对象):
ref_time = timezone.localtime(timezone.now(), timezone.get_default_timezone() )
threshold = datetime.combine( self.dueDate,
time(tzinfo=timezone.get_default_timezone()))
- timedelta(days = 1)
我将它们构建为具有相同的时区(它们具有),但它们最终具有两个不同的 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 分钟?)
【问题讨论】:
无关:确保你知道default time zone and current time zone之间的区别 【参考方案1】:一个时区在不同的时间可能有不同的 UTC 偏移量。 time(tzinfo=tz)
使用默认的 utc 偏移量,例如,最早的日期很可能 不是 你想要的。见:
获取tz
时区中的当前时间作为感知日期时间对象:
from datetime import datetime
ref_time = datetime.now(tz)
将self.dueDate
前一天的午夜作为感知日期时间对象:
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 小时前,请参阅How can I subtract a day from a python date?。
【讨论】:
非常感谢,使用 timezone.make_aware() 而不是设置 tzinfo 做到了。你拯救了我的一天! @pnjun:如果您执行可能跨越 DST 边界的日期时间算术,请小心。make_aware()
不会修复它,例如,如果你想要 24 小时前,那么你需要一个不同的代码。请参阅答案中的最后一个链接。以上是关于具有相同时区但不同 utcoffset() 的日期时间对象的主要内容,如果未能解决你的问题,请参考以下文章
具有相同时区信息的两个python日期时间对象的打印方式不同[重复]