一尘不染

在PHP和MySQL中设置时区

mysql

我正在制作一个需要使用PHP date()函数将日期存储在MySQL中的应用程序。

<?php $finalize_at = date('Y-m-d H:i:s'); ?>

这些日期需要在MySQL中使用NOW()函数返回以小时为单位的时差进行比较,例如:

SELECT TIMESTAMPDIFF( hour, NOW(), finalize_at ) FROM plans;

但是问题是– PHP date函数date('Y-m-d H:i:s')使用PHP时区设置,而该NOW()函数从MySQL服务器获取MySQL
timezome。

我正在尝试解决此问题:

  1. date_default_timezone_set('Europe/Paris'); 它仅适用于PHP。
  2. date.timezone= "Europe/Paris"; 它仅适用于PHP。
  3. SELECT CONVERT_TZ(now(), 'GMT', 'MET'); 此返回为空。
  4. mysql> SET time_zone = 'Europe/Paris'; 这从MySQL的控制台抛出错误。

而且对于MySQL,时区不会更改。

有什么方法可以更改PHP和MySQL的时区,而不必从MySQL控制台进行更改,或者从某个地方设置时区更改php.ini,并使这些值可用于PHP和MySQL。

非常感谢您的支持。


阅读 447

收藏
2020-05-17

共1个答案

一尘不染

在PHP中:

<?php
define('TIMEZONE', 'Europe/Paris');
date_default_timezone_set(TIMEZONE);

对于MySQL:

<?php
$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);

//Your DB Connection - sample
$db = new PDO('mysql:host=localhost;dbname=test', 'dbuser', 'dbpassword');
$db->exec("SET time_zone='$offset';");

现在,PHP和MySQL时区已在您的应用程序中同步。无需使用php.iniMySQL控制台!

这是来自SitePoint上的这篇文章

2020-05-17