我想让它在 MySQL 查询中调用 NOW() 和 CURDATE() 以 UTC 格式返回日期。如何在不经历和更改使用这些函数的所有查询的情况下实现这一点?
7 回答
终于找到了我要找的东西...
在 my.cnf 中,
[mysqld_safe]
timezone = UTC
我把这个选项放在 [mysqld] 下,mysql 无法启动。
调用“SET time_zone='+0:00';” 在每个页面加载上也可以工作,但我不喜欢在每个页面加载时调用该查询的想法。
将服务器的时钟设置为 UTC。不完全是。
如果你能做到,就去做。
最令人头疼的问题之一是在本地时区运行的“cron”作业等,这意味着一些 cron 作业将每年错过一次,而其余所有作业在 GMT 的不同时间运行半年(我假设您所在的时区有夏令时)。
MySQL 支持时区,但它很疯狂而且很混乱。如果不需要,请不要使用它。只需将服务器的时钟设置为 UTC,时间就会开始正常工作。
我知道更改服务器时钟对于任何托管系统来说都是一项重大更改,并且您可能有大量服务器和服务可能会受到影响,但无论如何请尝试这样做。质量检查工作可能很重要,但请尝试。
UTC_TIMESTAMP()
以 'YYYY-MM-DD hh:mm:ss' 或 YYYYMMDDhhmmss.uuuuuu 格式返回当前 UTC 日期和时间,具体取决于函数是在字符串还是数字上下文中使用。
UTC_DATE()
将当前 UTC 日期作为 'YYYY-MM-DD' 或 YYYYMMDD 格式的值返回,具体取决于函数是在字符串还是数字上下文中使用。
UTC_TIME()
以 'hh:mm:ss' 或 hhmmss.uuuuuu 格式返回当前 UTC 时间,具体取决于函数是在字符串还是数字上下文中使用。
MySQL 参考:https ://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_utc-timestamp
转到 /etc/mysql/my.cnf 文件并在 [mysqld] 部分下添加以下行
默认时区 = '+00:00'
然后重启你的mysql。现在选择 curtime(); 显示格林威治标准时间。
如果更改正在运行的生产服务器上的时区或更新关键配置设置并重新启动 mysql 似乎不切实际和/或矫枉过正,请尝试以下操作:
CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')
US/Pacific
您的NOW()
通话返回时间的时区在哪里。
正如 MarkR 所说,正确的方法是将服务器的时区更改为 UTC。
但是,也可以使用SET time_zone更改当前会话的时区。
从手册:
当前会话时区设置会影响对区域敏感的时间值的显示和存储。这包括由 NOW() 或 CURTIME() 等函数显示的值
您将需要使用 SET TIMESTAMP 语句将日期时间结果格式化为所需格式。这将意味着更改所有这些查询。sysdate() 不会遵守这一点。