ruby-on-rails - now - time ruby on rails
Rieles: obtén#beginning_of_day en zona horaria (8)
Como mencionó Leonid Shevtsov, Date.beginning_of_day
no Time.zone
a Time.zone en ActiveSupport 2.3
Una alternativa que utilicé, si está bloqueado usando Rails 4.0 o ActiveSupport 2.3, y necesita usar una fecha personalizada:
date = Date.new(2014,10,29)
date.to_time.change(hour: 0, min: 0, sec: 0).in_time_zone #.beginning_of_day
date.to_time.change(hour: 23, min: 59, sec: 59).in_time_zone #.end_of_day
Resultados:
2.0.0-p247 :001 > date = Date.new(2014,10,29)
=> Wed, 29 Oct 2014
2.0.0-p247 :002 > date.to_time.change(hour: 0, min: 0, sec: 0)
=> 2014-10-29 00:00:00 -0500
2.0.0-p247 :003 > date.to_time.change(hour: 0, min: 0, sec: 0).in_time_zone
=> Wed, 29 Oct 2014 05:00:00 UTC +00:00
2.0.0-p247 :004 > date.to_time.change(hour: 23, min: 59, sec: 59)
=> 2014-10-29 23:59:59 -0500
2.0.0-p247 :005 > date.to_time.change(hour: 23, min: 59, sec: 59).in_time_zone
=> Thu, 30 Oct 2014 04:59:59 UTC +00:00
El alcance de mi modelo original fallido usando .beginning_of_day to .end_of_day no funcionó:
scope :on_day, ->(date) { where( created_at: date.beginning_of_day..date.end_of_day ) }
Y esto es lo que lo solucionó, ya que no pude actualizar a Rails 4.0
scope :on_day, ->(date) { where( created_at: date.to_time.change(hour: 0, min: 0, sec: 0).in_time_zone..date.to_time.change(hour: 23, min: 59, sec: 59).in_time_zone ) }
Tengo una configuración de zona horaria predeterminada para la aplicación de rieles. Y una instancia del objeto Date.
¿Cómo puedo obtener make Date # beginning_of_day para devolver el comienzo del día en la zona horaria especificada, pero no mi zona horaria local?
¿Hay algún otro método para obtener el comienzo del día en la zona horaria especificada para la fecha dada?
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"
Sé que esta publicación es antigua, pero ¿qué pasa con:
Time.zone.parse("12am")
Saliendo de la respuesta de Peder, esto es lo que hice para la zona horaria PST:
DateTime.now.in_time_zone("Pacific Time (US & Canada)").beginning_of_day
Date#beginning_of_day
siempre devolverá 00:00.
Pero según entiendo, quiere saber la hora en otra zona horaria mientras que en la zona horaria actual está comenzando el día.
Asi que. Averigüemos el comienzo del día en su lugar actual. Imagina que es París, Francia:
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
Ahora veamos qué hora es en Moscú:
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
Para diferentes formas now
día:
# 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)
y convertir Date
to DateTime
date = Date.new(2011,1,3).to_datetime.change(:offset => "EST")
may2 = Date.new(2012,5,2)
midnight = Time.zone.local(may2.year,may2.month,may2.day).beginning_of_day
Miércoles, 02 de mayo de 2012 00:00:00 UTC +00: 00
midnight = Time.zone.local(may2.year,may2.month,may2.day).in_time_zone("Moscow").beginning_of_day
=> Miércoles, 02 de mayo de 2012 00:00:00 MSK +04: 00
midnight = Time.zone.local(may2.year,may2.month,may2.day).in_time_zone("Alaska").beginning_of_day
=> Mar. 01 de mayo de 2012 00:00:00 AKDT -08: 00
AVISO, es el mal día.
Lo que se necesita es una forma de construir un TimeWithZone en la zona horaria correcta.
Time.zone="Alaska"
midnight = Time.zone.local(may2.year,may2.month,may2.day)
Realmente me disgusta esto, porque por lo que puedo ver, acabo de cambiar la noción de sistema de zona en la que estoy. La idea es cambiar las búsquedas de mi base de datos para que coincidan con la zona del cliente ... Tienes que guardar zona y restaurarla:
foo = Time.zone; Time.zone="Alaska"; midnight = Time.zone.local(may2.year,may2.month,may2.day); Time.zone = foo
Parece que debería poder llamar a TimeWithZone.new (), pero no descubrí cómo.
time_zone = Time.zone # any time zone really
time_zone.local(date.year, date.month, date.day)
El problema es que Date.beginning_of_day
no Date.beginning_of_day
Time.zone
en ActiveSupport 2.3
Compare https://github.com/rails/rails/blob/v2.3.11/activesupport/lib/active_support/core_ext/date/calculations.rb#L64 (AS 2.3)
a https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/calculations.rb#L74 y https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/date/zones.rb#L7 (AS 3)
ActiveSupport::TimeZone[''Europe/London''].parse(''30.07.2013'') # 2013-07-29 23:00:00 UTC
ActiveSupport::TimeZone[''Asia/Magadan''].parse(''30.07.2013'') # 2013-07-29 12:00:00 UTC
DateTime.now.in_time_zone(Time.zone).beginning_of_day