MySQL用now()时间不准确
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL用now()时间不准确相关的知识,希望对你有一定的参考价值。
检查下你mysql所在服务器的时间,now()函数是读取当前系统配置的时间,系统时间不准,自然now()函数得到的时间也就是不准的 参考技术A 这个now()是服务器的时间, 不是你客户端的时间 参考技术B 如果是日期字符串类型就是~CREATE TABLE 表名
(
time datetime NOT NULL DEFAULT NOW(),
...
)
如果是时间戳~
CREATE TABLE 表名
(
time int NOT NULL DEFAULT CURRENT_TIMESTAMP(),
...
)
-----希望对你有帮助~
如果是插入的时候的话~在对应值上填写
如何使 MySQL 的 NOW() 和 CURDATE() 函数使用 UTC?
【中文标题】如何使 MySQL 的 NOW() 和 CURDATE() 函数使用 UTC?【英文标题】:How do I make MySQL's NOW() and CURDATE() functions use UTC? 【发布时间】:2010-10-31 03:27:13 【问题描述】:我想让它在 MySQL 查询中调用 NOW() 和 CURDATE() 以 UTC 格式返回日期。如何在不经历和更改所有使用这些函数的查询的情况下实现这一点?
【问题讨论】:
不完全符合您的要求,但有时最好使用 UTC_TIMESTAMP() 这可能对你有帮助:***.com/questions/19023978/… 这个怎么样:w3resource.com/mysql/date-and-time-functions/… 【参考方案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() 不会遵守这一点。
【讨论】:
以上是关于MySQL用now()时间不准确的主要内容,如果未能解决你的问题,请参考以下文章
MYSQL 不接受 NOW() 作为日期时间字段的默认值 [重复]