首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在[日期]查询之前处理PHP + MySQL时区和MySQL组?

如何在[日期]查询之前处理PHP + MySQL时区和MySQL组?
EN

Stack Overflow用户
提问于 2013-02-06 09:09:44
回答 1查看 899关注 0票数 1

我正在使用Drupal 7、PHP和MySQL,并在从MySQL数据库查询时试图解决时区问题。

Drupal很好地处理日期:所有的日期都以UTC时间戳int的形式存储在db中,而时区转换通过每个用户配置文件中的时区设置进行,使用PHP 5的内置时区功能(因此每次运行PHP脚本时,脚本的时区设置为当前用户的时区)。

因此,只要我们坚持使用PHP,这一切都是很好的、很好的、相当无痛的。

当我们引入MySQL、时,事情开始变得棘手起来,因为似乎没有一种方法可以将当前的MySQL脚本时区与给定的MySQL查询完美地同步。最佳实践似乎要求处理PHP中的所有时区转换:只有在数据库中查询原始时间戳,然后根据需要在PHP中进行转换。

在大多数情况下,这似乎是合理的(即使有时速度有点慢),,但是我应该如何处理MySQL组的日期查询呢?例如,我正在构建一个处理分析的模块,并且经常想要这样做:

代码语言:javascript
运行
复制
GROUP BY YEAR(FROM_UNIXTIME(u.created)), MONTH(FROM_UNIXTIME(u.created))

所以我们遇到时区问题..。

已经想到的可能的解决办法:

  1. 硬编码时区:在我的模块中使用date_default_timezone_set()确保PHP始终设置为系统时区(所以MySQL时区= PHP )。换句话说,分析时区将是硬编码的,而不是尊重用户查看分析的时区。这并不理想,因为我们希望在多个时区中的用户能够使用他们的时区访问分析。而且,date_default_timezone_set()似乎把Drupal搞得一团糟,因为它为整个脚本设置了时区,而不是仅仅在特定的函数中.
  2. 忘记在查询中使用GROUP :只需从db中获取所有原始数据(可能有数万行或数十万行),然后在php中使用for循环将结果按日期分组.这个解决方案似乎会大大增加资源的密集性,速度更慢,而且有点荒谬。

所以我想我要问的是,我错过了什么吗?这里有我不知道的最佳做法吗?

非常感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2013-02-06 09:52:16

我会考虑这样的方法

代码语言:javascript
运行
复制
SET time_zone = '+02:00';

http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html

并有

代码语言:javascript
运行
复制
GROUP BY FROM_UNIXTIME(u.created, '%Y-%m');

由于FROM_UNIXTIME是建立在time_zone的基础上的,所以这应该会给出预期的结果。

若要撤消time_zone更改,请考虑先保存SELECT TIMEDIFF(NOW(), CONVERT_TZ(now(), @@session.time_zone, '+00:00'));,然后将其设置为保存后的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14725240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档