【问题标题】:Using freezegun, why do pytz.utc and utcnow() output different datetimes?使用 freezegun,为什么 pytz.utc 和 utcnow() 输出不同的日期时间?
【发布时间】:2015-09-20 12:38:52
【问题描述】:

我很困惑,为什么使用 freezegun 冻结时间的函数会根据调用 datetime.datetime.utcnow()datetime.datetime.now(pytz.utc) 输出不同的 UTC 时间。我不是说它坏了,只是我不明白为什么,想知道!

例如,使用这个函数:

@freeze_time("2012-01-14 03:21:34", tz_offset=-4)
def test():
    print("utcnow(): %s" % datetime.datetime.utcnow())
    print("pytz.utc: %s" % datetime.datetime.now(pytz.utc))

输出是:

utcnow(): 2012-01-14 03:21:34
pytz.utc: 2012-01-13 23:21:34+00:00

我猜第一个是天真的日期时间,但为什么它们的时间不同?

(最终我想知道的原因:如果我在测试中使用 freezegun,并且我使用 pytz 在正在测试的代码中生成时间,我想知道它的“正确”行为应该是什么。)

【问题讨论】:

  • 考虑到tz_offset=-4 这不是正确的吗?一个知道另一个是幼稚的
  • 我不知道,这就是我问的原因:) 我假设你可以使用 freezegun 设置时区偏移量,并且你要求每个人都提供 UTC,他们都会有同时。即使只有一个附加了时区。
  • 我的意思是,如果你在那个函数中输出datetime.datetime.now(),你会得到2012-01-13 23:21:34。 freezegun 是否将时间冻结到 2012-01-14 03:21 UTC 或 2012-01-13 23:21 UTC?
  • 现在使用日期和时间转换为 tz 的时区。 utcnow 是格林威治标准时间
  • 所以你是说:freezegun 将时间设置为 2012-01-14 03:21 UTC,时区设置为 -4 小时。 datetime.datetime.now() 是当地时间(即 2012-01-13 23:21),我人为地强制该时间获得 UTC 时区信息?

标签: python datetime pytz freezegun


【解决方案1】:

这是 freezegun 中的一个问题,请参阅 herehere

看起来这个问题不会很快得到解决。最后我用这个作为解决方法:

def freezegun_utc_workaround():
    return datetime.utcnow().replace(tzinfo=pytz.utc)

为此

 datetime.datetime.now(pytz.utc)

可能最好将它包装起来并手动修补它。

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2015-10-01
    • 2021-09-20
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2021-12-24
    相关资源
    最近更新 更多