处理时区有两个关键:
将所有日期/时间存储在同一时区(可以是任何时区,但使用 UTC 确实可以简化事情。)
决定您的应用程序日期/时间将在哪里转换为/从存储时区转换为用户显示时区。这可以在数据库抽象层、应用程序代码或页面模板(基本上是 MVC 堆栈的任何部分)中完成。重要的是要保持一致。
还要记住,php 有自己的独立于 MySQL 的时区设置。如果您正在运行 php >5.1,则可以在运行时使用 date_set_default_timezone() 更改 php 时区。
如果您决定在数据库中检索/存储信息时进行时区转换,MySQL 的 convert_tz() 函数将成为您最好的新朋友。
对我来说,将时区转换作为页面模板的一部分是最简单的。日期/时间以 UTC 时区存储在数据库中,所有应用程序逻辑也以 UTC 格式保存。在 HTML 中输出日期时,我使用 php 的 date() 的包装函数来输出用户时区中的日期:
function getTimezoneOffset($time, $timezone)
{
$t = new DateTime(date('Y-m-d H:i:s', $time));
$tz = new DateTimeZone($timezone);
$t->setTimeZone($tz);
return $t->getOffset();
}
function myDate($timezone, $format, $timestamp=false)
{
if (!$timestamp) $timestamp = time();
return date($format, $timestamp+getTimezoneOffset($timestamp, $timezone));
}
同样,当通过表单从用户那里获取输入时,首先进行时区转换,以便您的应用程序可以使用 UTC 日期/时间。
另一种选择是使用 PostgreSQL——与 MySQL 不同,它内置了对 datetimes 的时区支持。