【问题标题】:Need to display timestamp from database [duplicate]需要显示数据库中的时间戳[重复]
【发布时间】:2019-09-09 04:10:45
【问题描述】:

我的服务器位于另一个时区,当我将 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 日期,我使用的是在插入表时自动更新的时间戳。我确信必须有一个选项来启用夏令时,只是从未遇到过。

【问题讨论】:

  • Jerusalem 是 +3...
  • 我不明白你的问题。夏令时使我们穿越时空。 MySQL 不这样做。如果您希望未来多出一小时,您必须自己添加该小时。最好的选择是在 PHP 中格式化时间显示
  • SET time_zone= 'Asia/Jerusalem'?使用预先确定的偏移量是不正确的,它会忽略 DST 规则。

标签: php mysql timezone


【解决方案1】:

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

$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,我可以在当地时间获得该日期。

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

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 2011-07-19
    • 2012-04-24
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 2021-01-04
    • 2014-01-09
    • 2018-07-28
    相关资源
    最近更新 更多