根据更改时区并从MYSQL获取结果

时间:2012-12-27 16:59:47

标签: php mysql timezone

我正在开发一个新项目,它有很多不同的数据,并且全部存储在具有相同时区时间戳的数据库中,东海岸,我确保服务器时区在通过<加载任何内容之前切换到它/ p>

date_default_timezone_set("America/New_York");

但是我似乎无法绕过它,我希望有一个允许时区选择的搜索功能,如果他们选择西海岸时区,我应该只更改PHP部分吗?或者我应该不同地查询数据库?所有的数据都是非常时间敏感的,并且很难将这些数据包裹起来。

任何帮助或逻辑都将受到赞赏:P

1 个答案:

答案 0 :(得分:1)

主要问题是MySQL对时区的支持是可笑的。大多数其他数据库允许您将时区定义为datetime列的一部分,而不是MySQL。相反,它们会强制您进行连接范围或服务器范围的时区设置。

您最好的选择是确保MySQL将所有日期时间存储为GMT / UTC。您可以通过在connect上运行SET time_zone = 'UTC'来强制执行此操作。在设置字符集的同时执行此操作。您 设置连接字符集,正确

PHP方面,您可以使用DateTimeDateTimeZone的组合来从MySQL获取日期时间并将其显示在用户的时区中。例如,让我们假装我们从MySQL 2012-11-13 14:15:16列中获取日期DATETIME。从PHP交互式提示符:

php > $from_mysql = '2012-11-13 14:15:16';
php > $utc = new DateTimeZone('UTC');
php > $ts = new DateTime($from_mysql, $utc);
php > $pdt = new DateTimeZone('America/Los_Angeles');
php > $ts_pdt = clone $ts;
php > $ts_pdt->setTimezone($pdt);
php > echo $ts_pdt->format('r'), "\n";
Tue, 13 Nov 2012 06:15:16 -0800

如上所示,如果UTC不是您使用date_default_timezone_set设置的时区,则只需要明确告知您是UTC,即可创建DateTime。切换DateTime的时区就像给它一个新的一样简单。我在这里使用clone来处理副本。 DateTimes是可变的,有时很容易发现自己不小心搞了它。

反向日期数学以相同的方式工作,只需将其选择转换为UTC并对原生数字运行数学。

TL; DR:

  • 商店仅在日期时间内以UTC(GMT)执行计算
  • 仅在用户的时区显示所有日期时间