1

我在 application.rb 中将 Rails 时区设置为“莫斯科”。

当我询问当地时间时,它返回一个比实际当地时间早一小时的值。

如何解决本地转换的错误时间?

2.0.0-p481 :003 > Time.zone
 => #<ActiveSupport::TimeZone:0x000000058a5750 @name="Moscow", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Europe/Moscow>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: 1301180400>,#<TZInfo::TimezoneOffset: 14400,0,MSK>>,nil>>
2.0.0-p481 :004 > Time.now
 => 2015-09-14 10:37:39 +0000
2.0.0-p481 :005 > Time.current
 => Mon, 14 Sep 2015 14:37:44 MSK +04:00
2.0.0-p481 :006 > tz = TZInfo::Timezone.get('Europe/Moscow')
 => #<TZInfo::DataTimezone: Europe/Moscow>

这里Time.current应该返回Mon, 14 Sep 2015 13:37:44 MSK +03:00

附言

Rails.version == '4.2.1'

4

1 回答 1

4

看起来您正在使用IANA Time Zone database的过期副本。欧洲/俄罗斯时区在 2014 年 10 月将时钟从 +04:00 永久设置回 +03:00。此更改包含在时区数据库的2014f 版本中。

Rails(通过 TZInfo)将从系统的 zoneinfo 目录或 tzinfo-data gem 获取时区数据。您可以通过运行检查正在使用哪个数据源:

TZInfo::DataSource.get.to_s

如果返回"Zoneinfo DataSource: /path/to/zoneinfo",则从命名目录中读取过期数据。您可能可以通过从您的操作系统经销商处安装更新来更新您的时区数据。

如果DataSource.get返回"Ruby DataSource",那么您使用的是旧版本的 tzinfo-data gem(版本 1.2014.6 之前)。gem 'tzinfo-data'要更新,请删除您的行中的任何版本约束Gemfile,然后运行bundle update​​.

如果您正在使用系统 zoneinfo 目录,但无法更新它,那么您可以通过添加gem 'tzinfo-data'到 Gemfile 并运行来切换到使用 tzinfo-data gem bundle install

于 2015-09-15T11:05:26.307 回答