2

我的日期方法在 Heroku 上无法正常工作。我创建了一个用户,(GMT-05:00) Eastern Time (US & Canada)并假设看到根据date它所具有的属性添加的产品。所以它应该说Added 1 Product Today,但它好像是前一天记录的方法本身。所以today实际上是昨天,yesterday实际上是后天。

这是我的方法:

  def self.today
    where(:date => Date.today)
  end

  def self.yesterday
    where(:date => Date.yesterday)
  end

  def self.this_week
    where(:date => Date.today.beginning_of_week..Date.today.end_of_week)
  end

  def self.last_week
    where(:date => 1.week.ago.beginning_of_week..1.week.ago.end_of_week)
  end

  def self.this_month
    where(:date => Date.today.beginning_of_month..Date.today.end_of_month)
  end

  def self.last_month
    where(:date => 1.month.ago.beginning_of_month..1.month.ago.end_of_month).order('date desc')
  end

所以我想它总是-1 day适用于 Heroku 上的每种方法,但不是在开发中。Heroku 的时区和时间是:

Loading production environment (Rails 3.2.8)
irb(main):001:0> Time.now
Time.now
=> 2012-09-21 02:37:26 +0000
irb(main):002:0> Time.zone
Time.zone
=> (GMT+00:00) UTC

这对我来说是错误的,因为它2012-09-20在美国东部。

我想让这些方法适用于每个时区,而不仅仅是Eastern Timezone我应该怎么做呢?如何让用户根据时区查看他们添加的产品?

谢谢你。

4

3 回答 3

2

好吧,如果您想要一个全球时区,最简单的方法是设置heroku config:set TZ一个合适的值。这涵盖了从 libc 开始的所有内容。

但是,用户特定的时区意味着您需要在每个请求的上下文中更改时区。“每个请求”应该立即让您想到“在控制器中”。

事实证明,Rails(特别是 ActionSupport)为此提供了Time.zone=. 碰巧这很常见,以至于zone=文档包含专门针对这种情况的示例代码:

class ApplicationController < ActionController::Base
  around_filter :set_time_zone

  def set_time_zone
    old_time_zone = Time.zone
    Time.zone = current_user.time_zone if logged_in?
    yield
  ensure
    Time.zone = old_time_zone
  end
end

此外,如果您无法让用户从列表中选择他们的时区,您可以根据 JavaScript 中检测到的时区偏移量进行猜测。总比没有好。

于 2012-09-21T04:07:03.517 回答
1

您需要在时间点搜索函数前面加上 in_time_zone。例如Date.today.beginning_of_week应该是Date.today.in_time_zone(users_tz).beginning_of_week.

于 2012-09-21T05:03:59.510 回答
0

将此行添加到 config 文件夹下的 application.rb

config.active_record.default_timezone = 'GMT + 5.30'

于 2012-09-21T05:00:37.360 回答