【问题标题】:How to fix date methods from being off on heroku?如何修复日期方法在heroku上关闭?
【发布时间】:2012-09-21 03:00:04
【问题描述】:

我的日期方法在 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

所以我猜 Heroku 上的每个方法总是 -1 day,但不是在开发中。 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,那么我应该怎么做呢?如何让用户根据时区查看他们添加的产品?

谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 heroku


    【解决方案1】:

    好吧,如果您想要一个全球时区,最简单的方法就是将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
    

    此外,如果您无法让用户从列表中选择他们的时区,您可以guess based on the time zone offset detected in JavaScript。有总比没有好。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        config.active_record.default_timezone = 'GMT + 5.30'

        【讨论】:

          猜你喜欢
          • 2021-10-27
          • 2020-06-11
          • 2016-03-13
          • 1970-01-01
          • 1970-01-01
          • 2023-03-02
          • 2013-07-14
          • 1970-01-01
          • 2018-06-11
          相关资源
          最近更新 更多