【问题标题】:PHP - mktime store wrong date in mysqlPHP - mktime 在 mysql 中存储错误的日期
【发布时间】:2025-12-12 03:00:01
【问题描述】:

当我通过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() 的 unixtime,并尝试使用 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”,如果我更改时区,则不会发生任何变化。

【问题讨论】:

  • 你到底想用那个日期做什么?这没有任何意义。
  • 据我所知,SQL 的时间/日期格式 (DATETIME) 存储为 YYYY-MM-DD,而您正在使用 m-d-Y
  • 我在创建mktime()后使用unixtime来存储FROM_UNIXTIME()
  • @JohnConde 我怀疑你会碰这个,即使有一根 20 英尺长的杆子;)即使是时间之父也必须时不时地喘口气。 不能全部保存。
  • @Fred-ii- 虽然我怀疑你的评论认识到了问题的症结所在,但他们无法清楚地表达他们想要做什么的事实使得这个问题无法回答。很遗憾,因为这可能是一个非常简单的问题。

标签: php mysql date unix-timestamp mktime


【解决方案1】:

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

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

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

【讨论】:

  • 如果我存储带有小时和分钟的 DATETIME 会解决问题吗?因为当我在mysql服务器上做SELECT FROM_UNIXTIME(UNIX_TIMESTAMP())时,日期就等于时钟了。
  • 是的,SELECT FROM_UNIXTIME(UNIX_TIMESTAMP()) 将只返回本地时间,因为UNIX_TIMESTAMP() 创建当前时间的 UTC 表示,然后FROM_UNIXTIME 将其从 UTC 转换回本地时间。您可以将任何日期/时间存储在 DATETIME 列中,MySQL 不会使用它存储(或暗示)任何时区信息。根据您的要求,最好将日期简单地存储为 UTC 日期,并将它们转换为前端中的适当时区并转换为用户的本地时间。