1

我已将服务器时间设置为 UTC,并且我production.rbconfig.time_zone = 'Pacific Time (US & Canada)'应用程序使用太平洋时间。

在 ruby​​ 控制台中,Time.now 显示的是 UTC 而不是太平洋!

这是正常的吗?

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

谢谢!梅尔

4

1 回答 1

3

在没有 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 使用 /etc/localtime在类 Unix 系统上定义的时区,除非您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 
于 2018-03-30T00:29:15.910 回答