Time.now没有显示正确的时间?

时间:2013-11-12 14:47:41

标签: ruby-on-rails timezone

我已将我的服务器时间设置为UTC,并将production.rb设置为config.time_zone = 'Pacific Time (US & Canada)',因为我的应用正在使用太平洋时间。

在ruby控制台中,Time.now显示UTC而非太平洋!

这是正常的吗?

如何确保我的应用使用PST?

谢谢! 梅尔

1 个答案:

答案 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生成日期和时间对象。但是你需要了解如何使用这些方法:

  • 使用Time.current而不是Time.now。
  • 使用Date.current而不是Date.today。

示例:

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