带 ActiveSupport 的默认时区(无 Rails)

问题描述 投票:0回答:3

如何在 ActiveSupport 中设置默认时区?

这是发生的事情:

irb -r 'rubygems'
ruby-1.8.7-p174 > require 'active_support' 
ruby-1.8.7-p174 > require 'active_support/time_with_zone'
ruby-1.8.7-p174 > Time.zone
ruby-1.8.7-p174 > nil

如何将其默认设置为当前位置?

ruby timezone activesupport
3个回答
8
投票

在rails中,它通过rails初始化程序在environment.rb中设置

Rails::Initializer.run do |config|
    config.time_zone = 'Pacific Time (US & Canada)'
    # ...

我刚刚做了一个测试,当config.time_zone被注释掉时,rails项目中的Time.zone也会返回nil;所以我猜没有“默认”,它只是在初始化器中设置

我猜你已经知道这会“起作用”?

irb -r 'rubygems'
ruby-1.8.7-p174 > require 'active_support' 
ruby-1.8.7-p174 > require 'active_support/time_with_zone'
ruby-1.8.7-p174 > Time.zone
ruby-1.8.7-p174 > nil
ruby-1.8.7-p174 > Time.zone = 'Pacific Time (US & Canada)'
ruby-1.8.7-p174 > Time.zone
=> #<ActiveSupport::TimeZone:0x1215a10 @utc_offset=-28800, @current_period=nil, @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>>

注意:上面的代码使用的是rails 2.2.2,新版本的情况可能有所不同?

编者注:在rails >= 3.0中,所有猴子补丁都已移至

core_ext
命名空间,因此上述要求不会扩展
Time
。对于更高版本的
ActiveSupport
版本,请使用以下内容:

require 'active_support/core_ext/time/zones'

6
投票

您可以使用来自 2 个来源的值设置时区,其自己的 ActiveSupport 简短列表(约 137 个值,请参阅 ActiveSupport::TimeZone.all 获取它们)或来自 IANA 名称(约 590 个值)。在最后一种情况下,您可以使用 tzinfo gem (ActiveSupport 的依赖项)来获取列表或实例 TZInfo::TimezoneProxy :

例如

ActiveSupport::TimeZone.all.map &:name

Time.zone = ActiveSupport::TimeZone.all.first

Time.zone = ActiveSupport::TimeZone.all.first.name

Time.zone = ActiveSupport::TimeZone.new "Pacific Time (US & Canada)"

Time.zone = ActiveSupport::TimeZone.find_tzinfo "Asia/Tokyo"

列出所有国家、所有时区:

TZInfo::Country.all.sort_by { |c| c.name }.each do |c|
  puts c.name # E.g. Norway
  c.zones.each do |z|
    puts "\t#{z.friendly_identifier(true)} (#{z.identifier})" # E.g. Oslo (Europe/Oslo)
  end
end

0
投票

使用类似的东西

Time.zone_default = Time.find_zone! ENV['TZ']

并将其设置在环境变量中。根据您的项目设置在初始值设定项或environment.rb 中进行设置。

© www.soinside.com 2019 - 2024. All rights reserved.