Rails:在时区中获得#beginning_of_day

Bog*_*iev 21 timezone ruby-on-rails date activesupport ruby-on-rails-2

我有一个rails应用程序的默认时区设置.和Date对象的一个​​实例.

如何让Date#beginning_of_day返回指定时区内的一天的开头,而不是我当地的时区.

是否有其他方法可以在给定日期的指定时区内开始白天时间?

date = Date.new(2014,10,29)

zone = ActiveSupport::TimeZone.new('CET')
date.foo(zone) # should return "Wed, 29 Oct 2014 00:00:00 CET +01:00"

zone = ActiveSupport::TimeZone.new('UTC')
date.foo(zone) # should return "Wed, 29 Oct 2014 00:00:00 UTC +00:00"
Run Code Online (Sandbox Code Playgroud)

Ped*_*der 41

DateTime.now.in_time_zone(Time.zone).beginning_of_day
Run Code Online (Sandbox Code Playgroud)


Leo*_*sov 20

time_zone = Time.zone # any time zone really
time_zone.local(date.year, date.month, date.day)
Run Code Online (Sandbox Code Playgroud)

问题是,Date.beginning_of_day不支持Time.zoneActiveSupport 2.3

比较https://github.com/rails/rails/blob/v2.3.11/activesupport/lib/active_support/core_ext/date/calculations.rb#L64(AS 2.3)

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/calculations.rb#L74https://github.com/rails/rails/blob/master/activesupport /lib/active_support/core_ext/date/zones.rb#L7(AS 3)

  • 它现在在4.1中为我做了,'Time.now.beginning_of_day`和`Date.today.beginning_of_day`在我的应用程序时区返回正确的时间 (3认同)

fl0*_*00r 9

Date#beginning_of_day 将始终返回00:00.

但据我所知,你想知道在其他时区的时间,而在当前时区是一天的开始.

所以.让我们在你当前的地方找到一天的开始.想象一下,它是法国巴黎:

bd = DateTime.now.in_time_zone('Paris').beginning_of_day
# or just
bd = DateTime.now.in_time_zone(1).beginning_of_day
#=> Thu, 24 Mar 2011 00:00:00 WET +01:00
Run Code Online (Sandbox Code Playgroud)

现在让我们来看看莫斯科几点钟了:

moscow_time = bd.in_time_zone("Moscow") # or in_time_zone(3)
#=> Thu, 24 Mar 2011 02:00:00 AST +03:00
london_time = bd.in_time_zone("London")
#=> Wed, 23 Mar 2011 23:00:00 GMT +00:00
kyiv_time = bd.in_time_zone("Kyiv")
#=> Thu, 24 Mar 2011 01:00:00 EET +02:00 
Run Code Online (Sandbox Code Playgroud)

对于不同的表格now日:

# You even shouldn't call now, because it by default will be 00:00
date = DateTime(2011, 1, 3).in_time_zone("-10")
# or
date = DateTime.new(2011,1,3,0,0,0,"-10")
# and same way as above
moscow_time = date.in_time_zone("Moscow") # or in_time_zone(3)
Run Code Online (Sandbox Code Playgroud)

并转换DateDateTime

date = Date.new(2011,1,3).to_datetime.change(:offset => "EST")
Run Code Online (Sandbox Code Playgroud)

  • 我同意wioth @ fl00r @Bogdan ...让我们保持文明,记得有人在这里帮助你. (2认同)

Tim*_*m S 5

离开佩德的回答,这是我对 PST 时区所做的事情:

DateTime.now.in_time_zone("Pacific Time (US & Canada)").beginning_of_day
Run Code Online (Sandbox Code Playgroud)