我有一个有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
#<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>>
module MyProject
class Application < Rails::Application
config.time_zone = 'Tokyo'
end
end
答案 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