PHP和MySQL之间的时差

PHP和MySQL之间的时差,php,mysql,time,timezone,Php,Mysql,Time,Timezone,我搜索了很多链接,但到目前为止我还没有找到解决问题的方法 我有一个网络主机在运行,它返回PHP和MySQL的时间不同: PHP日期时间=>13/02/2018 17:10:50 MySQL日期时间=>13/02/2018 12:10:50 我已经将我的PHP时区设置为: date_default_timezone_set('America/Sao_Paulo'); 有人知道调整MySQL时间的方法吗 谢谢这是因为MySQL没有在DATETIME类型上存储时区信息 可能您的PHP脚本正在发送

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

我有一个网络主机在运行,它返回PHP和MySQL的时间不同:

  • PHP日期时间=>13/02/2018 17:10:50
  • MySQL日期时间=>13/02/2018 12:10:50
我已经将我的PHP时区设置为:

date_default_timezone_set('America/Sao_Paulo');
有人知道调整MySQL时间的方法吗


谢谢

这是因为MySQL没有在
DATETIME
类型上存储时区信息

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


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

我在以下链接找到了解决方案:

实际上,我同步了我的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';");
定义('时区','美国/圣保罗');
日期\默认\时区\设置(时区);
$now=新日期时间();
$mins=$now->getOffset()/60;
$sgn=($mins<0?-1:1);
$mins=绝对值($mins);
$hrs=楼层(分钟/60美元);
$mins-=$hrs*60;
$offset=sprintf('%+d:%02d',$hrs*$sgn,$min);
//我已经有了连接功能
$return=pdo_mysql(“设置时区=“$offset”;”);

MySQL可能像预期的那样使用UTC。在数据库中保留UTC时间。不要使用当地时间。你会后悔的。时间应该是用户的函数,是用户在查看您的数据时在世界上的位置,而不是数据库的地理位置。@tadman是对的。许多框架都使用这种策略,例如Drupal,所有时间都以UTC存储。谢谢你的回答tadman。但是在PHP中设置默认时区不应该将时间转换为它?@marcsfelipe(你应该在用户名前面使用
@
符号,如果他们没有收到你的消息),这就是我们所说的“Gambiarra”。如果将来你在多个时区工作,你会遇到麻烦。此外,在每个mysql连接中,您需要手动设置时区,为每个连接添加一个不必要的查询。您至少应该在mysql服务器配置上设置时区。@EliasSoares。但是在DB或应用程序中设置我的时区有什么区别呢?在任何情况下,我都需要设置用户位置并将其应用于PHP和DB。有没有其他解决方法?“甘比亚拉”太棒了。。。在应用程序中设置时区的主要区别在于开销。你在做一个不必要的查询。显然,这只适用于您有权更改mysql配置文件的情况。如果使用
TIMESTAMP
类型,则不会出现此问题,因为它存储时区,并且当您检索数据并对其进行解析时,它将始终与您存储的时间完全相同。阿布拉索!:)理解。我会看一看,在我的下一个应用程序中,尝试以这种方式进行处理。感谢您的帮助@EliasSoares。阿布拉索!