我有一个具有Tokyo(+0900)
时区的导轨项目。
和OS本地时区为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>>
config/application.rb
module MyProject
class Application < Rails::Application
config.time_zone = 'Tokyo'
end
end
这已在Ruby 2.4
中固定https://wyeworks.com/blog/2016/6/6/22/behavior-changes-in-ruby-2.4
to_time(默认情况下)需要本地时区来转换时区域中的时间,并且仅接受:local或:utc时区域中的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
的时间,因此将在选定的时区添加时间。如果您希望将其设置为一天的开始
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 and of rails timezones