【发布时间】:2010-09-25 16:42:15
【问题描述】:
PHP 中时区的一些问题已经在我脑海中浮现了一段时间,我想知道是否有比我目前正在做的更好的方法来处理它。
所有问题都围绕着重新格式化数据库存储日期:
在处理必须支持多个时区(对于用户)的站点时,为了规范存储时间戳的时区,我总是使用 CURRENT_TIMESTAMP 属性或 NOW() 函数将其与服务器时区一起存储。
这样我就不必考虑在输入时间戳时为 PHP 设置的时区(因为 PHP 时间函数可以识别时区)。对于每个用户,根据他的偏好,我使用以下命令在引导文件中的某处设置时区:
date_default_timezone_set($timezone);
当我希望使用 php date() 函数格式化日期时,必须进行某种形式的转换,因为 MySQL 当前以 Y-m-d H:i:s 格式存储时间戳。不考虑时区,您可以简单地运行:
$date = date($format,strtotime($dbTimestamp));
问题在于 date() 和 strtotime() 都是时区感知函数,这意味着如果 PHP 时区设置与服务器时区不同,时区偏移量将应用两次(而不是我们想要的一次) )。
为了解决这个问题,我通常使用不支持时区的UNIX_TIMESTAMP() 函数检索 MySQL 时间戳,允许我直接在其上应用 date() - 从而只应用一次时区偏移量。
我不太喜欢这种“hack”,因为我不能再像往常一样检索这些列,或者使用* 来获取所有列(有时它可以大大简化查询)。此外,有时使用UNIX_TIMESTAMP() 根本不是一种选择(尤其是在使用没有太多抽象查询组合的开源包时)。
另一个问题是在存储时间戳时,如果不能使用 CURRENT_TIMESTAMP 或 NOW() - 存储 PHP 生成的时间戳会将其与我希望避免的时区偏移一起存储。
我可能在这里遗漏了一些非常基本的东西,但到目前为止,我还没有想出一个通用的解决方案来处理这些问题,所以我不得不逐个处理它们。非常欢迎您的想法
【问题讨论】:
-
对于任何发现此问题并想阅读该主题的人:stackoverflow.com/questions/2532729/…