【问题标题】:Why 1 hour wrong?为什么错了1小时?
【发布时间】:2016-03-24 00:50:14
【问题描述】:

斯德哥尔摩(欧洲)的时间是 15:0x。但我的本地化时间错了 1 小时:

>>> datetime.datetime.now()
datetime.datetime(2015, 12, 17, 15, 2, 42, 633000)
>>> babel.dates.format_datetime(datetime.datetime.now(), 'full', tzinfo=pytz.timezone('Europe/Stockholm'),locale='en')
u'Thursday, December 17, 2015 at 4:02:49 PM Central European Standard Time'
>>>

错在哪里?

【问题讨论】:

  • 时区,显然......几乎任何时候你得到一个正好 1 小时(或其倍数)的预期日期,它都会与时区相关。
  • 我很确定datetime.now() 已经包含了当地时间。试试datetime.utcnow(),它默认为Nonedocs.python.org/2/library/datetime.html#datetime.datetime.now的时区
  • 但是您没有告诉系统您的输入日期在哪个时区,所以它假设某些“错误”。您只为输出指定了 TZ。
  • 或者,您可以在 datetime.now 中指定时区:datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))
  • 另一种解决方案可能是将明确的 timezoe 传递给 dateime.now() 调用

标签: python datetime pytz python-babel


【解决方案1】:

显式优于隐式。设置now的时区:

now = datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))

【讨论】:

  • 谢谢!我们能做到这一点很好。输出非常整洁。
  • @Programmer400:优点是.now(tz) 即使在本地时间可能不明确的 DST 转换期间也能正常工作。如果您需要使现有的天真日期时间对象识别时区,请使用tz.localize(dt, is_dst=None)
  • .now(tz) always worksdatetime(tzinfo=tz) 是错误的,除非 tz 是固定偏移时区。
  • @J.F.Sebastion:感谢您提供的信息。
【解决方案2】:

问题似乎出在datetime.datetime.now() 调用的当地时间。如 cmets 中所述,使用datetime.datetime.utcnow() 表示时区不可知论coordinated universal time,或将所需的时区信息输入到日期时间调用datetime.datetime.now(tz=pytz.timezone('Europe/Stockholm'))

【讨论】:

  • 这是我现在使用的解决方案。
  • 然而,不知何故被否决:),享受,快乐的编程
  • @Busturdust 很好的答案!如何将第二种方法与我的 datetime 变量而不是 datetime.now 一起使用?
  • 如果你有一个 datetime 类型的变量,你应该可以做 variable.now
猜你喜欢
  • 2019-11-11
  • 2013-03-03
  • 2012-05-01
  • 2022-09-22
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
相关资源
最近更新 更多