【发布时间】:2010-10-31 03:27:13
【问题描述】:
我想让它在 MySQL 查询中调用 NOW() 和 CURDATE() 以 UTC 格式返回日期。如何在不经历和更改所有使用这些函数的查询的情况下实现这一点?
【问题讨论】:
-
不完全符合您的要求,但有时最好使用 UTC_TIMESTAMP()
我想让它在 MySQL 查询中调用 NOW() 和 CURDATE() 以 UTC 格式返回日期。如何在不经历和更改所有使用这些函数的查询的情况下实现这一点?
【问题讨论】:
终于找到了我要找的东西……
在 my.cnf 中,
[mysqld_safe]
timezone = UTC
我把这个选项放在 [mysqld] 下,mysql 无法启动。
调用“SET time_zone='+0:00';”在每个页面加载时也可以工作,但我不喜欢在每个页面加载时调用该查询的想法。
【讨论】:
将服务器的时钟设置为 UTC。真的没有。
如果你能做到,那就去做吧。
最令人头疼的一个是“cron”作业等,在本地时区运行,这意味着一些 cron 作业将每年错过一次,而所有其他作业在 GMT 的不同时间运行半年(我'我假设你所在的时区有夏令时)。
MySQL 支持时区,但它很疯狂而且很混乱。如果不需要,请不要使用它。只需将服务器的时钟设置为 UTC,时间就会开始正常运行。
我知道更改服务器时钟对于任何托管系统来说都是一项重大更改,并且您可能有大量服务器和服务可能会受到影响,但无论如何请尝试这样做。 QA 工作可能很重要,但请尝试一下。
【讨论】:
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
【讨论】:
转到 /etc/mysql/my.cnf 文件并在 [mysqld] 部分下添加以下行
默认时区 = '+00:00'
然后重启你的mysql。现在选择 curtime();显示格林威治标准时间。
【讨论】:
如果更改正在运行的生产服务器上的时区或更新关键配置设置并重新启动 mysql 似乎不切实际和/或矫枉过正,试试这个:
CONVERT_TZ(NOW(), 'US/Pacific', 'UTC')
US/Pacific 是您的 NOW() 调用返回的时间所在的时区。
【讨论】:
CONVERT_TZ( NOW(), 'SYSTEM', 'UTC' ) 以使用 MySQL 服务器当前设置使用的任何时区。
CONVERT_TZ( NOW(), 'SYSTEM', '+00:00' )
UTC_TIMESTAMP()?我认为 OP 想要一个不需要更改代码的解决方案。
+00:00 是否有效地设置了格林威治标准时间,而您在半年的时间里仍然休息一个小时?
正如 MarkR 所说,正确的方法是将服务器的时区更改为 UTC。
不过,也可以使用SET time_zone 更改当前会话的时区。
来自手册:
当前会话时区设置会影响区域敏感时间值的显示和存储。这包括 NOW() 或 CURTIME() 等函数显示的值
【讨论】:
您需要使用 SET TIMESTAMP 语句将日期时间结果格式化为所需格式。这将意味着更改所有这些查询。但是 sysdate() 不会遵守这一点。
【讨论】: