当前位置:  开发笔记 > 编程语言 > 正文

处理PHP中的时区

如何解决《处理PHP中的时区》经验,为你挑选了2个好方法。

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_TIMESTAMPNOW()不是一个选项时 - 存储PHP生成的时间戳将使用我想避免的时区偏移来存储它.

我可能在这里遗漏了一些非常基本的东西,但到目前为止我还没有能够提出处理这些问题的通用解决方案,所以我不得不逐个处理它们.你的想法非常受欢迎



1> Amr Mostafa..:

几个月前,我们花了一些时间思考这个问题.我们最终得到的技术非常简单:

    以GMT/UTC存储日期(例如0时区偏移).

    从数据库中检索后应用当前用户时区偏移量(例如,在向用户显示之前或随时显示).

我们使用Unix时间戳格式.但那没关系.



2> John Conde..:

从PHP 5.2开始,您可以使用DateTime,这样可以轻松处理时区:

$datetime = new DateTime($dbTimestamp, $timezone);
echo $datetime->format('Y-m-d H:i:s');
$datetime->setTimezone(new DateTimeZone('Pacific/Nauru'));
echo $datetime->format('Y-m-d H:i:s');

推荐阅读
吻过彩虹的脸_378
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有