我正在开发一个新项目,其中有很多不同的数据,并且所有数据都存储在具有相同时区时间戳的数据库中,东海岸,我确保在通过<加载任何内容之前将服务器时区切换到它/p>
date_default_timezone_set("America/New_York");
但是我似乎无法理解它,我想要一个允许选择时区的搜索功能,如果他们选择西海岸时区怎么办,我应该只更改 PHP 部分吗?或者我应该以不同的方式查询数据库?所有数据都对时间非常敏感,事实证明我很难理解这些数据。
任何帮助或逻辑将不胜感激:P
最佳答案
主要问题是 MySQL 对时区的支持可笑。大多数其他数据库允许您将时区定义为日期时间列的一部分,但 MySQL 不允许。相反,它们会强制您进行连接范围或服务器范围的时区设置。
最好的选择是确保 MySQL 将所有日期时间存储为 GMT/UTC。您可以通过在连接时运行 SET time_zone = 'UTC'
来强制执行此操作。在设置字符集的同时执行此操作。您正在设置连接字符集,对吗?
PHP 端,您可以使用 DateTime 的组合和 DateTimeZone从 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_default_timezone_set
设置的时区,您只需明确告诉它您是 UTC 来创建 DateTime。切换 DateTime 的时区就像给它一个新的时区一样简单。我在这里使用了clone
来处理副本。日期时间是可变的,有时很容易发现自己不小心破坏了它。
反向日期数学的工作方式相同,只需将其选择转换为 UTC 并在 native 数字上运行数学即可。
tl;博士:
- 仅存储 UTC (GMT) 日期时间并执行计算
- 仅显示用户所在时区的所有日期时间
关于php - 更改时区并基于此从 MYSQL 获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058283/