php - 需要显示来自数据库的时间戳

标签 php mysql timezone

<分区>

我的服务器在另一个时区,当我将 mysql 服务器设置为我的时区并显示当前时间时,它显示时间减去 1 小时,就好像我们仍然在冬季时间,尽管我们已经将我的时区移动到夏季时间 DTS . 我的代码,在 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 日期,我使用的是在插入表时自动更新的时间戳。我确信必须有一个选项来启用夏令时,只是从来没有遇到过。

最佳答案

我强烈建议在 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

在我的示例中考虑来自 DB 的日期 2019-04-18 20:38:00+00:00。如果我想在本地时间显示它,我将 DateTimeZone 对象传递给 setTimezone 并且我可以获得本地时间的日期。

您的示例的问题是耶路撒冷遵循夏令时,每年更改时区 6 个月。偏移量在 3 月 29 日从 +02:00 更改为 +03:00 并且您的 SQL 没有说明该更改。

关于php - 需要显示来自数据库的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752517/

相关文章:

php - 如何从两个不同的表中获取 session 变量?

php - 如何在本地主机上设置 CodeIgniter 站点?

php - MySQL - 如果为一组记录设置了另一个行值,则获取行

java - 将日期和时区从 GAE 服务器发送到 GWT 客户端

android - 在将数据转换为设备时区的同时获得4个小时的时间差?

javascript - moment.js - 考虑到我的时区是 GMT-3,哪一个是正确的输出?

php - Magento 2 Apache 随机 400 错误

php - 未指定输入文件

mysql - 显示列的 3 个最大值,包括带条件的重复值

php - 使用 .php 文件生成 MySQL 转储