【问题标题】:Datetime object with same timezone but different utcoffset()具有相同时区但不同 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 分钟?)

【问题讨论】:

标签: python django datetime


【解决方案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 小时前,那么你需要一个不同的代码。请参阅答案中的最后一个链接。
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多