sirven - ruby obtiene tiempo en la zona horaria dada
zonas horarias gmt (7)
Simplemente agregue o reste la cantidad adecuada de segundos:
>> utc = Time.utc(2009,5,28,10,1) # given a utc time => Thu May 28 10:01:00 UTC 2009 >> bst_offset_in_mins = 60 # and an offset to another timezone => 60 >> bst = t + (bst_offset_in_mins * 60) # just add the offset in seconds => Thu May 28 11:01:00 UTC 2009 # to get the time in the new timezone
En ruby, ¿cómo puedo obtener la hora actual en una zona horaria determinada? Sé el desplazamiento de UTC, y quiero obtener la hora actual en la zona horaria con ese desplazamiento.
Una forma más sencilla de hacerlo es simplemente pasar el desplazamiento (en forma de número entero) al hash ActiveSupport :: TimeZone:
ActiveSupport::TimeZone[-8]
=> #<ActiveSupport::TimeZone:0x7f6a955acf10 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/Los_Angeles>, @utc_offset=nil, @current_period=#<TZInfo::TimezonePeriod: #<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1320570000>,#<TZInfo::TimezoneOffsetInfo: -28800,0,PST>>,#<TZInfo::TimezoneTransitionInfo: #<TZInfo::TimeOrDateTime: 1331460000>,#<TZInfo::TimezoneOffsetInfo: -28800,3600,PDT>>>>
Para un desplazamiento UTC de x horas, la hora actual se puede calcular con la ayuda de ActiveSupport en Rails, como dijeron los otros:
utc_offset = -7
zone = ActiveSupport::TimeZone[utc_offset].name
Time.zone = zone
Time.zone.now
o en lugar de las dos líneas
DateTime.now.in_time_zone(zone)
O bien, si no tiene Rails, también puede usar new_offset
para convertir un DateTime a otro huso horario
utc_offset = -7
local = DateTime.now
local.new_offset(Rational(utc_offset,24))
Usaría la gema ActiveSupport :
require ''active_support/time''
my_offset = 3600 * -8 # US Pacific
# find the zone with that offset
zone_name = ActiveSupport::TimeZone::MAPPING.keys.find do |name|
ActiveSupport::TimeZone[name].utc_offset == my_offset
end
zone = ActiveSupport::TimeZone[zone_name]
time_locally = Time.now
time_in_zone = zone.at(time_locally)
p time_locally.rfc822 # => "Fri, 28 May 2010 09:51:10 -0400"
p time_in_zone.rfc822 # => "Fri, 28 May 2010 06:51:10 -0700"
Intenté gem install active_support
, instalé activesupport-3.00, lo que me dio un error:
"No tiene instalado tzinfo en su aplicación. Por favor agréguelo a su Gemfile y ejecute bundle install"
tzinfo
es una joya que usa ActiveSupport - fue un poco más limpia para mis propósitos, no tiene dependencias externas - la desventaja es que parece dejar todo como UTC, así que si quieres que tus zonas horarias se vean correcto, gem install activerecord
instalará todo lo que necesita. Estoy incluyendo esta respuesta principalmente como referencia para otros que se encuentran con el mismo problema / googlability.
(usa gem install tzinfo
) para instalar la gema
require ''tzinfo''
zone = TZInfo::Timezone.get(''US/Eastern'')
puts zone.now
hay varias maneras diferentes de obtener las zonas horarias, pero puede ver una lista usando
TZInfo::Timezone.all
gem install tzinfo
Entonces
require ''tzinfo''
tz = TZInfo::Timezone.get(''US/Pacific'')
Time.now.getlocal(tz.current_period.offset.utc_total_offset)
Una solución más simple y ligera:
Time.now.getlocal(''-08:00'')
Bien documentado aquí .
Actualización 2017.02.17: si tiene una zona horaria y desea convertirla en una compensación que puede usar con #getlocal incluido el horario de verano, esta es una forma de hacerlo:
require ''tzinfo''
timezone_name = ''US/Pacific''
timezone = TZInfo::Timezone.get(timezone_name)
offset_in_hours = timezone.current_period.utc_total_offset_rational.numerator
offset = ''%+.2d:00'' % offset_in_hours
Time.now.getlocal(offset)
Si quieres hacer esto por otros momentos aparte de #now
, deberías estudiar en la clase Ruby Time , particularmente Time#gm
y Time#local
, y las clases Ruby TZInfo , particularmente TZInfo::Timezone.get
TZInfo::Timezone#period_for_local
y TZInfo::Timezone#period_for_local