使用Date#to_time方法时如何考虑时区

时间:2016-06-21 00:07:01

标签: ruby-on-rails timezone

我有一个有Tokyo(+0900)时区的Rails项目。

操作系统本地时区为Bangkok(+0700)

Date#to_time方法没有考虑时区。

Date.current.to_time
2016-06-21 00:00:00 +0700

我现在使用Time.zone.parse方法:

Time.zone.parse(Date.current.to_s)
Tue, 21 Jun 2016 00:00:00 JST +09:00

是否有更好的方法可以使用适当的时区将日期转换为时间?

Time.zone

Time.zone
#<ActiveSupport::TimeZone:0x007fa8402f86f0 @name="Tokyo", @utc_offset=nil, @tzinfo=#<TZInfo::TimezoneProxy: Asia/Tokyo>, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionDefinition: #<TZInfo::TimeOrDateTime: -578044800>,#<TZInfo::TimezoneOffset: 32400,0,JST>>,nil>>

配置/ application.rb中

module MyProject
  class Application < Rails::Application
   config.time_zone = 'Tokyo'
  end
end

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

默认情况下,

to_time使用本地时区来转换时区中的时间,并且它仅接受参数中的local或:utc时区。因此,您必须在.to_time对象上应用Date之前设置时区。

Time.zone = "Tokyo"
irb(main):046:0> Date.current.to_time
=> Tue, 21 Jun 2016 09:00:00 JST +09:00

或者您可以使用块.use_zone来保留该块设置特定块的时区。

irb(main):046:0> Time.use_zone("Tokyo"){Date.current.to_time}
=> Tue, 21 Jun 2016 09:00:00 JST +09:00

以上结果将始终为您提供UTC的时间,因此将根据所选时区添加时间。如果您希望将其设置为当天的开始,则可以使用beginning_of_day

Time.zone = "Tokyo"
irb(main):048:0> Date.current.to_time.beginning_of_day
=> Tue, 21 Jun 2016 00:00:00 JST +09:00

irb(main):049:0> Time.use_zone("Tokyo"){ Date.current.to_time.beginning_of_day }
=> Tue, 21 Jun 2016 00:00:00 JST +09:00

使用Date对象进行Time Zone操作不是更好的方法,请始终使用Time对象来处理Time Zone

Time.zone =“东京”

irb(main):050:0> Time.zone.now.beginning_of_day
=> Tue, 21 Jun 2016 00:00:00 ICT +09:00

irb(main):051:0> Time.use_zone("Tokyo"){ Time.zone.now.beginning_of_day }
=> Tue, 21 Jun 2016 00:00:00 JST +09:00

Do’s and Don’ts of Rails Timezones