由于冬季时间更改 pytz 导致时区转换失败

Timezone conversion failed due to winter hour change pytz

提问人:Lirit 提问时间:10/29/2023 最后编辑:FObersteinerLirit 更新时间:10/29/2023 访问量:33

问:

在我的代码中,我尝试将日期转换为 pytz 时区,但由于凌晨 3 点更改为冬季时间,我的代码崩溃了。我有两个问题:第一,为什么更改时间会导致时区转换崩溃?二、如何避免这个bug? 这是我的代码:

purchase_date = make_aware(
    datetime.strptime(
        sale.findtext('n:purchasedate', namespaces={'n': ns}),
        '%d/%m/%Y-%H:%M'
    ),
    timezone('Europe/Paris')
)

返回错误:

Traceback (most recent call last):
  File "/app/manage.py", line 15, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python3.11/site-packages/django/core/management/__init__.py", line 436, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 412, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/usr/local/lib/python3.11/site-packages/django/core/management/base.py", line 458, in execute
    output = self.handle(*args, **options)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    purchase_date = make_aware(
                    ^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/django/utils/timezone.py", line 287, in make_aware
    return timezone.localize(value, is_dst=is_dst)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/site-packages/pytz/tzinfo.py", line 366, in localize
    raise AmbiguousTimeError(dt)
pytz.exceptions.AmbiguousTimeError: 2023-10-29 02:08:00

知道我的代码是在凌晨 3:02 执行的,而时间的变化发生在凌晨 3:00。

提前感谢您的任何回复!

Python django dst pytz

评论

3赞 Thierry Lathuille 10/29/2023
当地时间“2023-10-29 02:08:00”已经存在了两次,一次是在夏令时更改之前,一次是在夏令时更改之后,因此无法知道这个日期和时间指的是什么。最好使用 UTC 而不是本地时间以避免此类问题。
1赞 FObersteiner 10/29/2023
pytz.timezone 方法确实有一个关键字“is_dst”,可以在这种情况下使用(文档)。我想知道这是否在 django 中以某种方式实现。[附录] - 似乎已实施localize

答: 暂无答案