【问题标题】:Changing time zones and getting results from MYSQL based on that更改时区并基于此从 MYSQL 获取结果
【发布时间】:2012-12-27 16:59:47
【问题描述】:

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

date_default_timezone_set("America/New_York");

但是我似乎无法理解它,我想要一个允许选择时区的搜索功能,如果他们选择西海岸时区,我应该只更改 PHP 部分吗?或者我应该以不同的方式查询数据库?所有数据都对时间非常敏感,事实证明很难将其缠绕在我的脑海中。

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

【问题讨论】:

  • 你使用的是什么版本的 PHP?
  • 5.4 我已经通过 date_default_timezone_set 为西海岸设置了时区,它似乎可以解决问题,但是有些事情在逻辑上搞砸了

标签: php mysql timezone


【解决方案1】:

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

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

在 PHP 方面,您可以使用 DateTimeDateTimeZone 的组合从 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 来处理副本。 DateTimes 是可变的,有时很容易发现自己不小心破坏了它。

反向日期数学的工作方式相同,只需将他们的选择转换为 UTC 并在本地数字上运行数学。

tl;博士:

  • 存储仅在 UTC (GMT) 日期时间上执行计算
  • 显示用户所在时区的所有日期时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多