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

标签 php mysql timezone

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

相关文章:

php - FatalThrowableError 对 laravel 5.5 API 请求的 null 调用成员函数 where()

php - 如何让 IIS6 识别路径信息路由而不是返回 "404 Undescribed"错误?

php - 如何在 drupal 7/自定义内容类型/中设置此 View 的样式?

python - 如何为 django-cities-light country 模型添加资本?

java - 使用 Java 转换 ColdFusion 中的时区但无法获取新时间

php - 允许 PHP session 转移到子域

java - Hibernate OneToMany/ManyToOne 导致 SQLGrammarException

java - 多对多 Spring Boot JPA 未填充 ManyToMany 表

mysql - 没有重复的 SQL INSERT(没有主键或唯一键)

Java TimeZoneUpdater 因 java.io.EOFException 崩溃