gpt4 book ai didi

MySQL 将多个日期时间值映射到相同的 unix 纪元时间

转载 作者:可可西里 更新时间:2023-11-01 08:33:38 33 4
gpt4 key购买 nike

我运行以下 MySQL 查询:

select unix_timestamp('2011-03-13 02:00:13'), unix_timestamp('2011-03-13 02:20:41'), unix_timestamp('2011-03-13 02:40:10');

并得到以下奇怪的结果:

1300003200, 1300003200, 1300003200

我认为这里有某种夏令时,尽管所有的值都神奇地相同似乎仍然很奇怪。

我很感激关于如何防止 MySQL 在这里执行夏令时操作的建议,以及关于为什么所有结果都相同的一些解释。

最佳答案

MySQL 的行为是正确的,如果您的服务器时区“CDT”遵守夏令时并且您没有将 session 时区设置为其他时区。

UNIX_TIMESTAMP() 函数使用 session 的时区来解释您提供的值。

The server interprets date as a value in the current time zone and converts it to an internal value in UTC.

...

Note: If you use UNIX_TIMESTAMP() and FROM_UNIXTIME() to convert between TIMESTAMP values and Unix timestamp values, the conversion is lossy because the mapping is not one-to-one in both directions. For example, due to conventions for local time zone changes, it is possible for two UNIX_TIMESTAMP() to map two TIMESTAMP values to the same Unix timestamp value. FROM_UNIXTIME() will map that value back to only one of the original TIMESTAMP values.

http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

有问题的时间戳在您的时区不存在,因此服务器会为您提供最准确的可能答案...它是时钟向前移动到的 UTC 时间,当时间向前移动时,小于一个日期时间字面量之前的一小时,代表您所在时区的“当天不存在的时间”。

如果这些时间戳是您本地时区的时间,那么答案是这些是无效值,因为那个时间从未发生在您所在的地方。另一方面,如果实际上假设这些时间戳已经在 UTC 中,那么您在任何查询中都不会从 UNIX_TIMESTAMP() 获得正确答案,因为时间是“从”转换而来的它实际上没有表达的时区。

如果您SET @@TIME_ZONE = 'UTC'; 并重复查询,您就会明白我的意思,因为 UTC 没有 DST。此语句仅设置您 session 的时区,而不是整个服务器。

如果运行 SET @@TIME_ZONE = 'UTC'; 给你一条错误消息,例如 ERROR 1298 (HY000): Unknown or incorrect time zone: 'UTC' ,很可能您还没有用时区信息填充 MySQL。如所述here您可以使用以下命令加载此信息:

mysql_tzinfo_to_sql /usr/share/zoneinfo/ | mysql -u root mysql -p

路径 /usr/share/zoneinfo 可能需要替换为特定于您的系统的路径。

关于MySQL 将多个日期时间值映射到相同的 unix 纪元时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19394120/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com