PHP和MySQL之间的时间差异[重复]

Posted

技术标签:

【中文标题】PHP和MySQL之间的时间差异[重复]【英文标题】:Time difference between PHP and MySQL [duplicate] 【发布时间】:2018-07-24 05:57:39 【问题描述】:

我搜索了很多链接,但到目前为止我找不到解决问题的方法。

我在 Go Daddy 上有一个虚拟主机,它为 phpmysql 返回不同的时间:

PHP 日期时间 =>13/02/2018 17:10:50 MySQL 日期时间 =>13/02/2018 12:10:50

我已经将我的 PHP 时区设置为:

date_default_timezone_set('America/Sao_Paulo');

有人知道调整 MySQL 时间的方法吗?

谢谢

【问题讨论】:

MySQL 可能像它应该的那样使用 UTC。将您的时间以 UTC 格式保存在数据库中。不要使用当地时间。你会后悔的。时间应该是用户的函数,他们在查看您的数据时在世界上的位置,而不是数据库的地理位置。 @tadman 是对的。许多框架都使用这种策略,例如 Drupal,始终以 UTC 存储时间。 感谢您的回答。但是在 PHP 中设置我的默认时区不应该将时间转换为它? @MarcosFelipe(您应该在用户名前使用@ 符号,否则他们永远不会收到您的消息。) 【参考方案1】:

我在这个链接找到了我的解决方案:

https://www.sitepoint.com/synchronize-php-mysql-timezone-configuration/

实际上,我同步了我的 PHP 和 MySQL 时区。代码如下:

define('TIMEZONE', 'America/Sao_Paulo');
date_default_timezone_set(TIMEZONE);

$now = new DateTime();
$mins = $now->getOffset() / 60;

$sgn = ($mins < 0 ? -1 : 1);
$mins = abs($mins);
$hrs = floor($mins / 60);
$mins -= $hrs * 60;

$offset = sprintf('%+d:%02d', $hrs*$sgn, $mins);

// I already have a connection function
$return = pdo_mysql("SET time_zone='$offset';");

【讨论】:

这就是我们所说的“冈比亚拉”。如果将来您使用多个时区,您将遇到麻烦。此外,在每个 mysql 连接中,您都需要手动设置时区,为每个连接添加一个不必要的查询。您至少应该在您的 mysql 服务器配置上设置时区。 @EliasSoares。但是在数据库或应用程序中设置我的时区有什么区别?在任何情况下,我都需要设置用户位置并将其应用于 PHP 和 DB。还有另一种解决方法吗? “Gambiarra”太棒了...... Obrigado brasuca 在应用程序中设置时区的主要区别在于开销。你正在做一个不必要的查询。显然,这只适用于您有权更改 mysql 配置文件的情况。如果您使用TIMESTAMP 类型,则不会出现此问题,因为它存储时区,并且当您检索数据并对其进行解析时,它将始终与您存储的时间完全相同。阿布拉索! :) 明白。我会看一下,在我的下一个应用程序中尝试以这种方式接近。感谢您的帮助@EliasSoares。阿布拉索!【参考方案2】:

这是因为 MySQL 不存储 DATETIME 类型的时区信息。

可能您的 PHP 脚本正在发送带有 UTC+时区的 ISO8601 日期字符串,因此 MySQL 会忽略时区并仅存储 UTC。

为避免这种情况,您可以使用跟踪时区的TIMESTAMP 类型。

【讨论】:

以上是关于PHP和MySQL之间的时间差异[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在mysql查询中使用php time()函数计算两个日期之间的差异

MySQL:如何在几秒钟内获得两个时间戳之间的差异

类和函数之间的性能差异

计算两个日期时间odoo 10之间的差异[重复]

如何找到两个日期之间的天数差异[重复]

数据之间的接口差异:和数据?:[重复]