【发布时间】:2013-06-12 05:11:33
【问题描述】:
我有一个小型 Django 项目,可以将 MongoDB 中的数据转储导入 MySQL。在这些 Mongo 转储中是存储在纪元时间中的日期。无论时区如何,我都希望纪元时间相同,但我看到的是 Django TIME_ZONE 设置对 MySQL 中创建的数据有影响。
我一直在使用 MySQL UNIX_TIMESTAMP 函数测试我的数据库输出。如果我插入一个纪元为1371131402880(包括毫秒)的日期,我将我的时区设置为'America/New_York',UNIX_TIMESTAMP 给我1371131402,这是相同的纪元时间,不包括毫秒。但是,如果我将时区设置为 'America/Chicago',我会得到 1371127802。
这是我将纪元时间转换为 Python datetime 对象的代码,
from datetime import datetime
from django.utils.timezone import utc
secs = float(epochtime) / 1000.0
dt = datetime.fromtimestamp(secs)
我试图通过在 datetime 对象上放置一个明确的时区来解决此问题,
# epoch time is in UTC by default
dt = dt.replace(tzinfo=utc)
我已经单独测试了这个 Python 代码,它给了我预期的结果。但是,通过 Django 模型 DateTimeField 字段将这些对象插入 MySQL 后,它并没有给出正确的结果。
这是我的 MySQL 查询,
SELECT id, `date`, UNIX_TIMESTAMP(`date`) FROM table
我通过将此查询结果中的 unix 时间戳列与 MongoDB JSON 转储进行比较来测试这一点,以查看时代是否匹配。
这里到底发生了什么?为什么时区会对纪元时间产生影响?
仅供参考,我使用的是 Django 1.5.1 和 MySQL-python 1.2.4。我还将 Django USE_TZ 标志设置为 true。
【问题讨论】:
-
可能 MySQL 服务器的时区与您的应用程序的时区不匹配。问题在于 MySQL 将
UNIX_TIMESTAMP的参数解释为其私有时区中的本地时间。 -
为获得最佳结果,请始终在所有 MySQL 连接上设置
SET TIME_ZONE="+00:00",并将每个日期解释为 UTC。 -
术语 - “纪元”只是我们设置零的参考日期。大多数时间是 1970 年 1 月 1 日 UTC,但这并不意味着基于此日期的整数应称为“纪元时间”。其他系统中使用了许多其他纪元日期。
-
@Celada - 这对我来说似乎不对,但我不是 MySQL 专家。你能用一些参考链接备份它吗?如果是这样,请输入答案。我所知道的关于这种格式的日期的一切都表明 UTC 始终是参考时区。它似乎更有可能在某处更改类型或调用引入本地时区的函数。
-
好的,我刚刚通读了these mysql docs,现在我明白了。 Celada 确实对该函数说“参数”,这是一个包含格式化日期时间值的字符串。是的 - 它将
TIME_ZONE设置应用于此值是有道理的。我的观点是基础整数然后转换为UTC。因此,当表示为整数时,无论本地时区如何,UTC 始终是参考点。我只是陷入了措辞。应用。
标签: mysql django timezone epoch