如何在rails中使用Time.zone.now覆盖Time.now

时间:2018-02-21 17:51:56

标签: ruby-on-rails ruby timezone

您好我正在开发一个rails项目。我想要特定区域的时间,我知道我可以使用Time.zone.now 但我想首先设置区域,然后想要根据区域获得时间。是否有任何方法可以在设置区域后使用Time.now覆盖Time.zone.now方法。

我尝试在application_controller.rb中创建一个before操作,然后定义区域,但每当我尝试访问Time.now时,它总是返回没有时区的时间。请帮我。提前完成。

application_controller.rb
def set_current_time_zone
  Time.zone = current_user.time_zone unless current_user.blank?
end

3 个答案:

答案 0 :(得分:2)

为什么不使用Time.current?如果您在config.zoneTime.zone设置了区域,它会为您提供时区时间。

参见示例:

2.5.0 :021 > Time.zone = "Tallinn"
  => "Tallinn" 
2.5.0 :022 > Time.current
  => Wed, 21 Feb 2018 20:37:29 EET +02:00 
2.5.0 :023 > Time.zone = "New Delhi"
  => "New Delhi" 
2.5.0 :024 > Time.current
  => Thu, 22 Feb 2018 00:07:38 IST +05:30 

请参阅相应的关于.current方法的apidock和thoughtbot关于Ruby时区的好文章。

答案 1 :(得分:0)

这就是我按照Ryan Bates' railcast:http://railscasts.com/episodes/106-time-zones-revised

class ApplicationController < ActionController::Base

  around_action :set_time_zone, if: :current_user

  def set_time_zone(&block)
    Time.use_zone(current_user.time_zone, &block)
  end

end

use_zone方法需要一个块并设置该块持续时间的时区。请求完成后,将恢复原始时区。

然后,我可以使用Time.zone.now,它将始终使用为用户设置的正确time_zone(time_zone方法返回用户在其设置或UTC中配置的时区)。在控制器或模型中处理时,表单中的所有日期和时间字段也将在当前用户的时区中处理。

答案 2 :(得分:0)

希望这会有所帮助

module TimeOverride
  # overriding time to return time accoring to the application configured 
  #  timezone
  # instead of utc timezone
  def now
    super.getlocal(Time.zone.utc_offset)
  end
end

module DateTimeOverride
  # overriding time to return time accoring to the application configured 
  #timezone
  # instead of utc timezone
  def now
    Time.now.to_datetime
  end
end

Time.singleton_class.send(:prepend, TimeOverride)
DateTime.singleton_class.send(:prepend, DateTimeOverride)