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