您好我正在开发一个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
答案 0 :(得分:2)
为什么不使用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
请参阅相应的关于.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)