rails now ruby-on-rails date timezone activesupport ruby-on-rails-2

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