【发布时间】:2013-03-26 00:14:17
【问题描述】:
我有一个多租户 Rails 应用程序,有些模型有一个日期字段。是否可以为每条记录设置不同的时区。我会做一些事情,比如添加一个名为 time zone 的字段然后做Date.somemethodthatsetstimezone(timezone).now() 吗?抱歉,如果这是一个不好的问题。
【问题讨论】:
标签: ruby-on-rails date timezone
我有一个多租户 Rails 应用程序,有些模型有一个日期字段。是否可以为每条记录设置不同的时区。我会做一些事情,比如添加一个名为 time zone 的字段然后做Date.somemethodthatsetstimezone(timezone).now() 吗?抱歉,如果这是一个不好的问题。
【问题讨论】:
标签: ruby-on-rails date timezone
您的问题的简短回答是肯定的 - 但请确保您知道自己在做什么。
您需要查看ActiveSupport::TimeZone 和ActiveSupport::TimeWithZone。 ActiveSupport::TimeZone 提供时区作为值对象作为字符串访问。例如,您可以将字符串 'Eastern Time (US & Canada)' 存储在模型中的 time_zone 列中(假设为 @project),然后使用 ActiveSupport::TimeZone[@project.time_zone] 检索时区实例。
您可以使用Time.zone = 'Eastern Time (US & Canada)' 之类的方式设置当前进程的时区。 Rails 还允许您在应用程序配置中为您的应用程序配置时区。
您可以调用Time.zone.now 来返回当前 ruby 进程设置的时区中的当前时间(作为ActiveSupport::TimeWithZone 的一个实例)。
您可以拨打Time.now.in_time_zone('Eastern Time (US & Canada)')获取给定时区的当前时间。
您甚至可以为代码块设置时区:
Time.use_zone('Eastern Time (US & Canada)') do
# do stuff in eastern time
Time.now
# => current eastern time
end
此方法允许您使用模型中的时区和周围过滤器为整个 rails 请求设置时区:
around_filter :project_time_zone
# actions use project's configured time zone
private
def project_time_zone(&block)
Time.use_zone(@project.time_zone, &block)
end
其中一种方法应该可以满足您的需求。
【讨论】: