Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 更改时区并基于此从MYSQL获取结果_Php_Mysql_Timezone - Fatal编程技术网

Php 更改时区并基于此从MYSQL获取结果

Php 更改时区并基于此从MYSQL获取结果,php,mysql,timezone,Php,Mysql,Timezone,我正在做一个新的项目,它有很多不同的数据,都存储在数据库中,具有相同的时区时间戳,东海岸,我确保在通过 date_default_timezone_set("America/New_York"); 然而,我似乎不能把我的头围绕它,我想有一个搜索功能,允许时区选择,如果他们选择西海岸时区,我应该只改变PHP的一部分吗?或者我应该以不同的方式查询数据库?所有的数据都是非常时间敏感的,事实证明我很难把这些数据用头脑来描述 任何帮助或逻辑都将不胜感激:p主要问题是MySQL对时区的支持是可笑的。大多数

我正在做一个新的项目,它有很多不同的数据,都存储在数据库中,具有相同的时区时间戳,东海岸,我确保在通过

date_default_timezone_set("America/New_York");
然而,我似乎不能把我的头围绕它,我想有一个搜索功能,允许时区选择,如果他们选择西海岸时区,我应该只改变PHP的一部分吗?或者我应该以不同的方式查询数据库?所有的数据都是非常时间敏感的,事实证明我很难把这些数据用头脑来描述


任何帮助或逻辑都将不胜感激:p

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

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

在PHP方面,您可以使用和的组合从MySQL获取日期时间,并在用户的时区中显示它们。例如,让我们假设我们从MySQL
DATETIME
列中获取日期
2012-11-13 14:15:16
。从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\u default\u timezone\u set
设置的时区,您只需要通过明确告诉它您是UTC来创建DateTime。切换日期时间的时区就像给它一个新时区一样简单。我在这里使用了
clone
来制作副本。日期时间是可变的,有时很容易发现自己不小心撞到了它

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

tl;博士:

  • 仅以UTC(GMT)为单位存储和执行日期时间计算
  • 仅显示用户时区中的所有日期时间

您使用的是什么版本的PHP?5.4我已经通过date\u default\u timezone\u为西海岸设置了时区,它似乎做到了这一点,但是有些事情在逻辑上搞砸了