PHP - mktime 在 mysql 中存储错误的日期

标签 php mysql date unix-timestamp mktime

当我通过 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));

我正在使用服务器上的日期,将其更改为unixtime mktime()并尝试将 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 仍然存储前一天的日期。

Ex: today is 08/18/2014 and in the database is 2014-08-17

服务器中的 date_default_timezone 是“America/Cuiaba”,如果我更改时区,则不会发生任何变化。

最佳答案

根据定义,Unix 时间戳是 UTC。然而,MySQL 的 FROM_UNIXTIME implicitly converts MySQL 服务器时区的 unix 时间戳(与 PHP 的 default_date_timezone 设置完全不同)。

美洲/库亚巴时区为 UTC - 4 小时,因此日期“2014-08-18 00:00:00 (UTC)”实际上是 2014-08-17 20:00: 00(美国/库亚巴)”——因此存在明显的 1 天差异。

看看this answer了解如何在 MySQL 数据库中的时区之间进行转换。

关于PHP - mktime 在 mysql 中存储错误的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25368321/

相关文章:

java - Java 中两个 Timestamp 对象之间的差异

php - 在php中将mysql数字更改为日期格式

php - 是否存在与 PDO::FETCH_CLASS 相反的对象或将对象映射回数据库中

php - 既然 PEAR 方法不再可行,如何为 WAMP 安装 PhpUnit?

php - Laravel 测试 : Add attribute to pivot table

mysql - mysql中的确定性函数

php - 构建 foreach 循环

Javascript 日期似乎引用了不正确的 DST 开始/结束日期

mysql - 如何从belongs_to关联模型中确定by_month的范围?

php - 使用 PHPUnit 达到 100% 的代码覆盖率