您好,我正在从事Rails项目。我想要特定区域的时间,我知道我可以使用Time.zone.now
但是我想首先设置区域,然后想根据区域获得时间。是否有任何方式,以便在设置区域后可以用Time.zone.now
覆盖Time.now
方法。
我尝试在Application_controller.rb中创建一个之前的操作,然后定义区域,但是每当我尝试访问时间时。现在,它总是在没有时区域的情况下返回时间。请帮我。提前。
application_controller.rb
def set_current_time_zone
Time.zone = current_user.time_zone unless current_user.blank?
end
为什么不使用 Time.current
?如果您在config.zone
或Time.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
请参阅有关Ruby TimeZones的相应的有关。
希望这会有所帮助
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)
这就是我的做法,按照瑞安·贝茨(Ryan Bates(的轨道广播: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中配置的时区(。在控制器或模型中处理时,所有表格中的所有日期和时间字段也将在当前用户的时区进行处理。