我想按创建日期计数用户。当我查询最后一个用户时,我有:
> User.last.created_at
=> Thu, 07 Aug 2014 21:37:55 BRT -03:00
当我计算每个日期的用户数时,我得到这个:
> User.group("date(created_at)").count
=> {Fri, 08 Aug 2014=>1}
创建日期为8月7日,但结果为8月8日。发生这种情况是因为组条件是在UTC和我的时区是'巴西利亚'。我有这个在我的application.rb
:
config.time_zone = 'Brasilia'
config.active_record.default_timezone = :local
如何解决这个问题?
Try convert_tz first:
User.group("date(convert_tz(created_at,'UTC','[your_time_zone]'))").count
如果convert_tz返回null,可能需要使用以下命令行加载时区表:
$ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql convert_tz.
编辑1:如果您使用Rackspace MySQL,您将需要启用root访问数据库并以root身份运行时区查询。在这里,您可以找到如何安装trove
和使用rackspace API启用根访问的说明。
无时区功能,只需添加小时。
User.group("date(created_at + INTERVAL 8 HOUR)").count
加8小时是上海的时区。欢迎来到上海
你的数据库总是保存在UTC(除非你修改它),即使你的应用程序配置为使用巴西利亚当地时间。当你使用'where'语句时,Rails会给你一个选项来说明你所在的时区。但是集团声明没有这样的事情。一种解决方案是使用特定于数据库的函数(如@ jaugarchanganswer)。另一个是这样做的:
group = User.group("date(created_at)").count
results = group.map{|date, count| {Time.zone.utc_to_local(DateTime.parse(date)).to_date => count } }
- Pro:你不依赖于特定的数据库本地函数转换时区; 缺点:与第一个相比,没有那么快。程序员需要更多的时区知识才能理解这是怎么回事?