【问题标题】:Why does the timezone of the server affect MySQL reading of FROM_UNIXTIME epochs?为什么服务器的时区会影响 MySQL 读取 FROM_UNIXTIME 时期?
【发布时间】:2017-06-26 19:17:57
【问题描述】:

我认为如果您向 MySQL 传递一个 Epoch 时间戳(作为一个长整数)并使用 FROM_UNIXTIME() 将其作为可比较的日期,那么服务器的时区就无关紧要了。但确实如此(至少在我们的设置中——我们需要特定的配置吗?)。

使用 MySQL 版本:mysql Ver 14.14 Distrib 5.5.48-37.8,适用于 Linux (x86_64),使用 readline 5.1

我的服务器设置为 UTC。

当我运行如下查询时:

SELECT COUNT(*) FROM Orders
WHERE startTime BETWEEN FROM_UNIXTIME(1486509895) AND FROM_UNIXTIME(1486596296);

我收到了 127 个订单。

然后我将时区切换为 EST:

sudo mv /etc/localtime /etc/localtime.bak
sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
sudo service mysql3306 restart

然后我再次运行查询,这次我得到了 196 个订单!

为什么我的服务器的时区会影响它?时代不应受此影响。

【问题讨论】:

    标签: mysql datetime epoch


    【解决方案1】:

    The documentation for FROM_UNIXTIMESTAMP() 明确指出:

    将 unix_timestamp 参数的表示形式返回为 YYYY-MM-DD HH:MM:SSYYYYMMDDHHMMSS 格式的值,具体取决于函数是在字符串还是数字上下文中使用。 该值以当前时区表示。 unix_timestamp 是一个内部时间戳值,例如由UNIX_TIMESTAMP() 函数生成。

    这就是为什么我强烈建议您在 UTC 中运行您的服务器并在您的应用程序中进行任何转换,或者为您的查询指定一个偏移量。

    纪元时间(例如 UNIX time_t)以 UTC 表示,但如果您在环境中指定了时区,无论是 MySQL 还是其他,总是以本地时间呈现。原始数值不会根据您的时区而改变,实际上它根本没有时区的概念,但是将其转换为 YYYY-MM-DD 格式的字符串绝对需要时区来呈现任何有意义的东西.

    【讨论】:

      【解决方案2】:

      当然时区很重要。 FROM_UNIXTIME() 将时间瞬间转换为日期/时间表示。但是给定的瞬间可以代表不同的日期或时间,具体取决于时区。正如documentation 明确指出的那样:

      该值以当前时区表示。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-07-05
        • 2013-06-12
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2023-03-29
        • 2022-11-30
        相关资源
        最近更新 更多