【问题标题】:How do I make MySQL's NOW() and CURDATE() functions use UTC?如何使 MySQL 的 NOW() 和 CURDATE() 函数使用 UTC?
【发布时间】:2010-10-31 03:27:13
【问题描述】:

我想让它在 MySQL 查询中调用 NOW() 和 CURDATE() 以 UTC 格式返回日期。如何在不经历和更改所有使用这些函数的查询的情况下实现这一点?

【问题讨论】:

标签: mysql timezone utc


【解决方案1】:

终于找到了我要找的东西……

在 my.cnf 中,

[mysqld_safe]
timezone = UTC

我把这个选项放在 [mysqld] 下,mysql 无法启动。

调用“SET time_zone='+0:00';”在每个页面加载时也可以工作,但我不喜欢在每个页面加载时调用该查询的想法。

【讨论】:

  • 那么,对于每个人来说,timezone = UTC 必须进入 [mysqld_safe] 而不是 [mysqld] 是真的吗?
  • 将其放入 [mysqld] 使其无法启动。但对我来说,将它放在 [mysqld_safe] 中仍然会在使用 NOW() 时将日期作为本地时间。
  • 此设置不会为我将 mysql 更改为 UTC - mysql 5.5.47-0ubuntu0.14.04.1。然而,arulraj 下面的回答确实对我有用。
  • 参考here
【解决方案2】:

将服务器的时钟设置为 UTC。真的没有。

如果你能做到,那就去做吧。

最令人头疼的一个是“cron”作业等,在本地时区运行,这意味着一些 cron 作业将每年错过一次,而所有其他作业在 GMT 的不同时间运行半年(我'我假设你所在的时区有夏令时)。

MySQL 支持时区,但它很疯狂而且很混乱。如果不需要,请不要使用它。只需将服务器的时钟设置为 UTC,时间就会开始正常运行。

我知道更改服务器时钟对于任何托管系统来说都是一项重大更改,并且您可能有大量服务器和服务可能会受到影响,但无论如何请尝试这样做。 QA 工作可能很重要,但请尝试一下。

【讨论】:

  • 我以前读过这篇文章,想知道你在开发时会做什么?您是否将开发 PC 的时间设置为 UTC?
  • 您在 VM 中开发,并将 VM 时钟设置为 UTC。永远不要在您的台式 PC 上进行开发,这在很多方面都很痛苦,尤其是如果它是由您的公司 IT 部门管理的 Windows PC,他们一时兴起通过组策略进行任意配置更改。
  • 这绝对是这样做的方法。设置 VM 时区后,请确保重新启动 MySQL 服务器。
【解决方案3】:
UTC_TIMESTAMP()

以 'YYYY-MM-DD hh:mm:ss' 或 YYYYMMDDhhmmss.uuuuuu 格式返回当前 UTC 日期和时间,具体取决于函数是在字符串还是数字上下文中使用。

UTC_DATE()

将当前 UTC 日期作为 'YYYY-MM-DD' 或 YYYYMMDD 格式的值返回,具体取决于函数是在字符串还是数字上下文中使用。

UTC_TIME()

将当前 UTC 时间作为 'hh:mm:ss' 或 hhmmss.uuuuuu 格式的值返回,具体取决于函数是在字符串还是数字上下文中使用。

MySQL 参考:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_utc-timestamp

【讨论】:

    【解决方案4】:

    转到 /etc/mysql/my.cnf 文件并在 [mysqld] 部分下添加以下行

    默认时区 = '+00:00'

    然后重启你的mysql。现在选择 curtime();显示格林威治标准时间。

    【讨论】:

    • 在我的情况下(Windows 上的 xampp 安装),文件 my.cnf 不存在。我编辑 my.ini (path: C:\xampp\mysql\bin) 并在 [mysqld] 部分添加你的答案。然后我重启服务器就ok了
    • 如何重启mysql?你的意思是重启apache?
    • 这会受到夏令时的影响吗?我的意思是我认为 GMT 是 +0:00,但仍然有 DST,所以在半年里它会比 UTC 差一小时?
    【解决方案5】:

    如果更改正在运行的生产服务器上的时区或更新关键配置设置并重新启动 mysql 似乎不切实际和/或矫枉过正,试试这个:

    CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')
    

    US/Pacific 是您的 NOW() 调用返回的时间所在的时区。

    【讨论】:

    • 请注意,这需要timezone tables to be populated
    • 您也可以将其写为CONVERT_TZ( NOW(), 'SYSTEM', 'UTC' ) 以使用 MySQL 服务器当前设置使用的任何时区。
    • 不依赖于要填充的时区表,请使用CONVERT_TZ( NOW(), 'SYSTEM', '+00:00' )
    • 或者您可以直接致电UTC_TIMESTAMP()?我认为 OP 想要一个不需要更改代码的解决方案。
    • @nl-x 这会考虑夏令时吗?或者+00:00 是否有效地设置了格林威治标准时间,而您在半年的时间里仍然休息一个小时?
    【解决方案6】:

    正如 MarkR 所说,正确的方法是将服务器的时区更改为 UTC。

    不过,也可以使用SET time_zone 更改当前会话的时区。

    来自手册:

    当前会话时区设置会影响区域敏感时间值的显示和存储。这包括 NOW() 或 CURTIME() 等函数显示的值

    【讨论】:

      【解决方案7】:

      您需要使用 SET TIMESTAMP 语句将日期时间结果格式化为所需格式。这将意味着更改所有这些查询。但是 sysdate() 不会遵守这一点。

      【讨论】:

        猜你喜欢
        • 2014-08-07
        • 1970-01-01
        • 2015-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-08
        • 2015-07-22
        • 2012-03-18
        相关资源
        最近更新 更多