我已将服务器时间设置为 UTC,并且我production.rb
的config.time_zone = 'Pacific Time (US & Canada)'
应用程序使用太平洋时间。
在 ruby 控制台中,Time.now 显示的是 UTC 而不是太平洋!
这是正常的吗?
如何确保我的应用正在使用 PST?
谢谢!梅尔
我已将服务器时间设置为 UTC,并且我production.rb
的config.time_zone = 'Pacific Time (US & Canada)'
应用程序使用太平洋时间。
在 ruby 控制台中,Time.now 显示的是 UTC 而不是太平洋!
这是正常的吗?
如何确保我的应用正在使用 PST?
谢谢!梅尔
在没有 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 生成日期和时间对象。但是您需要了解如何使用这些方法:
还有这个例子:
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