我已将我的服务器时间设置为UTC,并将production.rb
设置为config.time_zone = 'Pacific Time (US & Canada)'
,因为我的应用正在使用太平洋时间。
在ruby控制台中,Time.now显示UTC而非太平洋!
这是正常的吗?
如何确保我的应用使用PST?
谢谢! 梅尔
答案 0 :(得分:0)
在没有Rails的情况下在Ruby中使用时区时我有自己的困惑,然后我发现了一篇澄清的文章。 Ruby与Date和Time类打包在一起。这些类不存在Rails:
require "time"
Time.parse("Dec 8 2015 10:19")
#=> 2015-12-08 10:19:00 -0200
Date.parse("Dec 8 2015")
#=> #<Date: 2015-12-08>
Time.new(2015, 12, 8, 10, 19)
#=> 2015-12-08 10:19:00 -0200
Date.new(2015, 12, 8)
Ruby默认使用在类似Unix的系统上/etc/localtime
中定义的时区,除非你像这样修改TZ
环境变量:
ENV["TZ"] = 'US/Eastern'
如果您的系统时间不是UTC时间,建议您执行此操作,然后您可以将环境更改为UTC:
Time.now
=> 2018-03-29 20:17:39 -0400
ENV['TZ']
=> nil
ENV['TZ'] = 'UTC'
=> "UTC"
Time.now
=> 2018-03-30 00:17:59 +0000
现在我知道Rails有自己的配置,您可以在application.rb
中找到:
config.time_zone = 'Eastern Time (US & Canada)'
config.active_record.default_timezone = :local
Rails将在您的应用程序中使用此时区配置,它将忽略TZ环境变量甚至系统默认值。
但是您需要了解的是Ruby将忽略Rails时区配置,即使在Rails环境的上下文中也是如此!那么你如何利用Rails配置而不是Ruby配置呢? Rails在ActiveSupport
中定义了自己的方法。这些方法将从ActiveSupport :: TimeWithZone生成日期和时间对象。但是你需要了解如何使用这些方法:
示例:
rails c
Time.now
=> 2018-03-29 20:20:14 -0400
ENV['TZ']
=> nil
ENV['TZ'] = 'UTC'
=> "UTC"
Time.now
=> 2018-03-30 00:20:35 +0000
Time.current
=> Thu, 29 Mar 2018 20:20:40 EDT -04:00