具有相同时区但不同 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 偏移量,例如,最早的日期很可能 不是 你想要的。见:

Datetime Timezone conversion using pytz datetime with pytz timezone. Different offset depending on how tzinfo is set pytz localize vs datetime replace

获取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日期时间对象的打印方式不同[重复]

设置utcOffset后设置时刻日期

在初始化期间创建具有不同时区的新 JavaScript 日期对象 [重复]

在具有正确日期的python中转换和计算日期时间对象的时区

时间戳减法必须具有相同的时区或没有时区,但它们都是 UTC

设置具有特定时区的日期时间