如何使MySQL的NOW()和CURDATE()函数使用UTC?

Cha*_*son 41 mysql timezone utc

我想这样做,所以在MySQL查询中调用NOW()和CURDATE()会以UTC格式返回日期.如何在不经过并更改使用这些功能的所有查询的情况下实现此目的?

Cha*_*son 36

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

在my.cnf中,

[mysqld_safe]
timezone = UTC
Run Code Online (Sandbox Code Playgroud)

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

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

  • 把它放在[mysqld]中使它无法启动.但是对我来说,将它放在[mysqld_safe]中仍然会在使用NOW()时将日期作为本地时间. (3认同)

Mar*_*rkR 25

将服务器的时钟设置为UTC.不完全是.

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

其中一个最令人头疼的问题是"cron"工作等,在当地时区运行,这意味着一些cron工作将每年错过一次,其余所有工作都在格林尼治标准时间的不同时间运行半年(我假设你在这个夏令时在这里的时区).

MySQL有时区支持,但它很疯狂并搞砸了.如果您不需要,请不要使用它.只需将服务器的时钟设置为UTC,时间就会开始工作.

我知道更改服务器时钟是任何托管系统的重大变化,并且您可能会有大量可能受到影响的服务器和服务,但请尽量尝试.质量保证工作可能很重要,但请尝试.

  • 您在VM中开发,并将VMs时钟设置为UTC.不要在台式机上进行开发,这在很多方面都很痛苦,特别是如果它是由公司IT部门管理的Windows PC,他们随心所欲地通过组策略进行任意配置更改. (5认同)

was*_*olz 22

UTC_TIMESTAMP()
Run Code Online (Sandbox Code Playgroud)

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

UTC_DATE()
Run Code Online (Sandbox Code Playgroud)

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

UTC_TIME()
Run Code Online (Sandbox Code Playgroud)

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

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


aru*_*net 14

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

default-time-zone ='+ 00:00'

然后重启你的mysql.现在选择curtime(); 显示GMT时间.


Dan*_*Dan 9

如果更改正在运行的生产服务器上的时区或更新密钥配置设置并重新启动mysql似乎不切实际和/或矫枉过正,请尝试以下操作:

CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')
Run Code Online (Sandbox Code Playgroud)

US/Pacific您的NOW()通话时间在哪里返回时间.

  • 您也可以将其写为 `CONVERT_TZ( NOW(), 'SYSTEM', 'UTC' )` 以使用 MySQL 服务器当前设置使用的任何时区。 (3认同)
  • 请注意,这需要[填充时区表](https://dev.mysql.com/doc/refman/5.7/en/time-zone-support.html) (2认同)
  • 为了不依赖于要填充的时区表,请使用 CONVERT_TZ( NOW(), 'SYSTEM', '+00:00' )` (2认同)

and*_*dri 5

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

但是,也可以使用SET time_zone来更改当前会话的时区。

从手册:

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