zonas zona sirven que para mundo mexico los husos horarios horarias horaria espaƱa ruby timezone

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