mktime在mysql中存储错误的日期


PHP - mktime store wrong date in mysql

当我通过FROM_UNIXTIME()存储日期时,日期存储的是前一天。我的调试代码:

$date = date("m-d-Y", time());
$date_unix = explode('-', $date);
if (count($date_unix) == 3) {
    list ( $m, $d, $y ) = $date_unix;
    $date_unix = mktime(0, 0, 0, $m, $d, $y);
}
echo "<br />Date: " . $date;
echo "<br />Date after mktime: " . $date_unix;
echo "<br />Date manual mktime: " . date("m-d-Y", mktime(0,0,0,8,18,2014));

我使用来自服务器的日期,将其更改为具有mktime()的unix时间,并尝试使用FROM_UNIXTIME()存储在数据库中。

$conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD);
$sql = "INSERT INTO data ( data ) VALUES ( FROM_UNIXTIME(:date_unix) )";
$st = $conn->prepare($sql);
$st->bindValue(":date_unix", $date_unix, PDO::PARAM_INT);
$st->execute();

在所有这些混乱之后,mysql仍然将日期存储在前一天。

举例:今天是08/18/2014,而数据库是2014-08-17

服务器的date_default_timezone是"America/Cuiaba",如果我更改时区,什么也不会改变。

Unix时间戳根据定义是UTC。但是,MySQL的FROM_UNIXTIME隐式地将unix时间戳转换为MySQL服务器的时区(这与PHP的default_date_timezone设置完全不同)。

America/Cuiaba时区是UTC - 4小时,所以日期"2014-08-18 00:00:00 (UTC)"实际上是2014-08-17 20:00:00 (America/Cuiaba)"——因此有明显的1天差异。

看一下这个关于如何在MySQL数据库中转换时区的答案