django,python为啥本地化后时间戳会发生变化

Posted

技术标签:

【中文标题】django,python为啥本地化后时间戳会发生变化【英文标题】:django, python why timestamp changes after localizedjango,python为什么本地化后时间戳会发生变化 【发布时间】:2022-01-06 02:33:51 【问题描述】:

代码:

import pytz
from django.utils import timezone

KST = pytz.timezone('Asia/Seoul')
UTC = pytz.timezone('UTC')

default_time = timezone.datetime(2021, 11, 29, 16, 44)

current_manual_kst = KST.localize(default_time)
current_manual_utc = default_time
print(current_manual_kst.timestamp())
print(current_manual_utc.timestamp())

结果:

>>> 1638171840.0
>>> 1638204240.0

所以,我可以看到结果不同。

我认为时间戳应该相同,但结果却不同。

为什么会这样? 以及如何从 KST.localized datetime 中获取相同的时间戳(默认:UTC)?

【问题讨论】:

我在代码中的任何地方都没有看到您的代码将 default_time 的 tzinfo 设置为 UTC,因此 default_time 将是幼稚的,因此被视为本地时间,无论是什么 - 因此,Unix 时间不一定要同意。请改用current_manual_utc = default_time.replace(tzinfo=UTC)。是的,在这里使用replace 是安全的。 【参考方案1】:

timestamp 以 UNIX 时间表示,即自 UTC 1970 年 1 月 1 日午夜以来的秒数。为了将 datetime 转换为这样的 UNIX 时间戳,datetime 需要被解释为 some 时区。因为你不能在不定义它所在的时区的情况下相对于 1970 UTC 表达它。所以如果你有一个天真的 datetime 对象(没有时区)并取它的 timestamp()它被解释为在你的本地时区并从那里转换为UTC。

首尔的 16:44 显然与您计算机的“本地”时区的 16:44 不同。

【讨论】:

以上是关于django,python为啥本地化后时间戳会发生变化的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 sftp 上传文件后文件权限发生变化?

为啥 Python 会在 Pygame 中为“事件”变量抛出未绑定的本地错误? [关闭]

我想知道为啥当我发送一个数组以使用 jquery ajax (django,jquery) 查看时发生错误

为啥我的 Django 应用程序可以在本地运行,但不能在 Heroku 上运行?

为啥我的 Django 工厂函数在本地数据库中创建模型,而不是测试数据库?

设置时间戳会引发 PSQLException:不支持的类型值:2,013