在 PHP/MySQL 中将日期时间存储为 UTC

2022-08-30 10:51:37

我读到的关于将时间转换为用户时区的任何地方都说,最好的方法是以UTC格式存储日期和时间,然后只需将用户的时区偏移量添加到此时间即可。

如何以 UTC 时间存储日期?我使用MySQL DATETIME字段。

当我在我的PHP代码中向MySQL添加新记录时,我会用它来插入MySQL DATETIME。now()

我是否需要使用与存储 UTC 时间不同的内容?now()


答案 1

MySQL: UTC_TIMESTAMP()

以“YYYY-MM-DD HH:MM:SS”或 YYYYMMDDHHMMSS.uuuuuu 格式的形式返回当前 UTC 日期和时间,具体取决于该函数是在字符串上下文中还是在数字上下文中使用

PHP: gmdate()

PHP 中还使用 PHP date_default_timezone_set() 来设置脚本的当前时区。您可以将其设置为客户端时区,以便所有格式设置函数都以本地时间返回时间。

事实上,虽然我很难让它工作,但总是偶然发现一些问题。例如。从MySQL返回的时间信息不会格式化为“UTC”,因此如果您不小心,strtotime会将其转换为本地时间。我很好奇是否有人有一个可靠的解决方案来解决这个问题,当日期遍历媒体边界(HTTP->PHP->MySQL和MySQL->PHP->HTTP)时不会中断,同时考虑XML和RSS / Atom。


答案 2

我建议在UTC时区插入日期。这将为您节省许多麻烦,让您在未来遇到夏令时问题。

INSERT INTO abc_table (registrationtime) VALUES (UTC_TIMESTAMP())

当我查询我的数据时,我使用以下PHP脚本:

<?php

while($row = mysql_fetch_array($registration)) { 

  $dt_obj = new DateTime($row['message_sent_timestamp'] ." UTC");
  $dt_obj->setTimezone(new DateTimeZone('Europe/Istanbul'));
  echo $formatted_date_long=date_format($dt_obj, 'Y-m-d H:i:s');
}
?>

您可以将该值替换为一个可用的 PHP 时区DateTimeZone


推荐