将Date对象转换为TimeWithZone

ava*_*tok 6 ruby ruby-on-rails activesupport

我需要将Date对象转换为TimeWithZone对象,该对象表示给定时区中那天的开始.

以下方法有效,但似乎太复杂,因为它要求我将日期转换为字符串:

?> date = Date.parse("2010-02-17")
=> Wed, 17 Feb 2010
>> ActiveSupport::TimeZone['Eastern Time (US & Canada)'].parse(date.to_s)
=> Wed, 17 Feb 2010 00:00:00 EST -05:00
>> ActiveSupport::TimeZone['UTC'].parse(date.to_s)
=> Wed, 17 Feb 2010 00:00:00 UTC 00:00
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法让我失踪?

编辑:人们建议的变体:

?> date.to_datetime.in_time_zone('Eastern Time (US & Canada)').beginning_of_day
=> Tue, 16 Feb 2010 00:00:00 EST -05:00
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这不是一个等价的转换,因为它在美国东部时间2月16日开始,而不是美国东部时间2月17日开始.

fea*_*ool 6

我迟到了,但这仍然是一个很好的问题.ActiveSupport in_time_zone是自OP以来引入的,但它完全符合您的要求,无需解析字符串(慢速)或设置Time.zone(冒险):

>> date = Date.parse("2010-02-17")
=> Wed, 17 Feb 2010
>> date.in_time_zone('Eastern Time (US & Canada)')
=> Wed, 17 Feb 2010 00:00:00 EST -05:00
Run Code Online (Sandbox Code Playgroud)

当然,如果你想用utc表示的开始,你可以这样做:

>> date.in_time_zone('Eastern Time (US & Canada)').utc
=> 2010-02-17 05:00:00 UTC
Run Code Online (Sandbox Code Playgroud)


gtd*_*gtd 5

如果您已Time.zone在 Rails 中设置,则可以调用Date#at_beginning_of_day(请参阅http://api.rubyonrails.org/classes/Date.html#method-i-at_beginning_of_day)。将此与以下进行对比Date#to_datetime

Time.zone
 => #<ActiveSupport::TimeZone:0x10cf10858 @tzinfo=#<TZInfo::TimezoneProxy: Etc/UTC>, @utc_offset=nil, @current_period=nil, @name="UTC"> 

date = Date.today
 => Thu, 31 May 2012 

date.to_datetime
 => Thu, 31 May 2012 00:00:00 +0000 

date.at_beginning_of_day
 => Thu, 31 May 2012 00:00:00 UTC +00:00 

Time.zone = 'America/Chicago'
 => "America/Chicago" 

date.to_datetime
 => Thu, 31 May 2012 00:00:00 +0000 

date.at_beginning_of_day
 => Thu, 31 May 2012 00:00:00 CDT -05:00
Run Code Online (Sandbox Code Playgroud)

  • `Time.zone` **是**线程安全的,它在 `Thread.current[:time_zone]` 中设置区域。[来源](https://github.com/rails/rails/blob/08754f12e65a9ec79633a605e986d0f1ffa4b251/activesupport/lib/active_support/core_ext/time/zones.rb#L39) (2认同)

小智 0

这样的事情对你有用吗?

'2010-04-01'.to_time.in_time_zone('Eastern Time (US & Canada)').beginning_of_day
Run Code Online (Sandbox Code Playgroud)