需要显示数据库中的时间戳

时间:2019-04-18 19:22:02

标签: php mysql timezone

我的服务器位于另一个时区,当我将mysql服务器设置为我的时区并显示当前时间时,它显示的时间为负1小时,好像我们仍在冬季,尽管我们已经将时区移到了夏令时。 。 我的代码,在php中:

$sql->query("SET time_zone= '+02:00' ;");  //sets mysql timezone
   $result = $sql->query("SELECT NOW();");
   while($row = mysqli_fetch_array($result)){
    echo "<br/>Database Date: ".$row[0];      //display current mysql time
    }

   date_default_timezone_set("Asia/Jerusalem"); //sets php timezone
   echo "<br/>PHP Date: ".date('Y-m-d H:i:s')."<br/>";

现在php时间可以完美显示,mysql时间可以提前一小时显示。(冬季时间) 我需要修复mysql日期,我使用的是时间戳,该时间戳在插入表时会自动更新。我确信必须有一个选项可以启用“夏令时”,只是从未遇到过。

1 个答案:

答案 0 :(得分:2)

我强烈建议您在UTC时间(即+00:00)对数据库执行所有操作。使用WHERE子句执行任何查询时,请将您的本地日期/时间转换为UTC并执行查询。从数据库选择时,使用PHP的\DateTime类将数据库值转换为人工输出。
这样,您就确切知道期望什么以及何时期望。您会不时为某些不合理的时间差异感到惊讶。

$now = $pdo->query("SELECT '2019-04-18 20:38:00+00:00'")->fetch(\PDO::FETCH_COLUMN);
$dateObj = new \DateTime($now);
$dateObj->setTimezone((new \DateTimeZone("Asia/Jerusalem")));
echo $dateObj->format(\DateTime::ATOM);
// outputs 2019-04-18T23:38:00+03:00
// now before DST change:
$now = $pdo->query("SELECT '2019-03-18 20:38:00+00:00'")->fetch(\PDO::FETCH_COLUMN);
$dateObj = new \DateTime($now);
$dateObj->setTimezone((new \DateTimeZone("Asia/Jerusalem")));
echo $dateObj->format(\DateTime::ATOM);
// outputs 2019-03-18T22:38:00+02:00

考虑我的示例日期2019-04-18 20:38:00+00:00来自数据库。如果要在本地时间显示它,可以将DateTimeZone对象传递给setTimezone,然后可以在本地时间获取该日期。

您的示例所遇到的问题是,耶路撒冷遵循夏令时(DST),每年更改时区为6个月。偏移量在3月29日从+02:00更改为+03:00,而您的SQL并未考虑该更改。