【问题标题】:Problems with conversion from unix time从unix时间转换的问题
【发布时间】:2013-11-11 13:50:55
【问题描述】:

我在尝试处理 MySQL 中的 unix 时间戳时发现了一些奇怪的东西。我注意到在转换为任意日期的 unix 时间戳时,'00:59:59''01:00:00' 之间的时间超过 1 秒。再深入一点,我有以下示例查询,结果我不明白:

SELECT FROM_UNIXTIME(1382835600) AS a, FROM_UNIXTIME(1382832000) AS b;
+---------------------+---------------------+
| a                   | b                   |
+---------------------+---------------------+
| 2013-10-27 01:00:00 | 2013-10-27 01:00:00 |
+---------------------+---------------------+

两个 unix 时间戳相隔 1 小时(3600 秒),但生成的时间戳相同。也许是时区问题,但毕竟是在同一台服务器上。

【问题讨论】:

  • 现在这真是令人困惑。我没有 MySQL 服务器来验证,让我们看看其他人怎么说。 +1 :)
  • 时间就是这样。有关更多信息,请参阅this answer

标签: mysql timezone timestamp unix-timestamp


【解决方案1】:

振作起来,冬天来了……

这是由夏令时到冬令时造成的,具体取决于您所在的时区 (see this link)。

2013 年 10 月 27 日是我们进入冬季时间的日子(至少对于欧洲国家而言)。凌晨 3 点,时间变成了凌晨 2 点,这解释了为什么这两个不同的时间戳具有相同的时间。

Extract from MySQL doc :

[FROM_UNIXTIME] 返回 unix_timestamp 参数 [...] 的表示。该值以当前时区表示。

如果我计算得好,您的工作时间是 GMT 时间。
几个小时后再试一次,你会发现一切正常:

SELECT FROM_UNIXTIME(1382839200) AS a, FROM_UNIXTIME(1382842800) AS b;

【讨论】:

    【解决方案2】:

    看起来很奇怪,看看我在 14.14 Distrib 5.1.51 上得到了什么:

    mysql> SELECT FROM_UNIXTIME(1382835600) AS a, FROM_UNIXTIME(1382832000) AS b;
    +---------------------+---------------------+
    | a                   | b                   |
    +---------------------+---------------------+
    | 2013-10-27 05:00:00 | 2013-10-27 04:00:00 |
    +---------------------+---------------------+
    1 row in set (0.00 sec)
    

    【讨论】:

    • 我假设您的时区是夏令时之间切换已经过去的时区。但是感谢您的测试。它证实了之前的答案,这是一个 DST 问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多