Carriles: convierte UTC DateTime a otra zona horaria


Respuestas:


206
time.in_time_zone(time_zone)

Ejemplo:

zone = ActiveSupport::TimeZone.new("Central Time (US & Canada)")
Time.now.in_time_zone(zone)

o solo

Time.now.in_time_zone("Central Time (US & Canada)")

Puede encontrar los nombres de las zonas horarias de ActiveSupport haciendo lo siguiente:

ActiveSupport::TimeZone.all.map(&:name)
# or for just US
ActiveSupport::TimeZone.us_zones.map(&:name)

En irb, cuando intento Time.now.in_time_zone ('CST'), aparece el error "método indefinido 'in_time_zone'". ¿Hay clases de rieles que necesito para que esto funcione?
— Drew Johnson

¿Qué versión de Rails estás usando? ¿Funciona si hace Time.zone.now.in_time_zone (...)?
— medido el

13
Para usar esto fuera de los rieles, require 'active_support/time'primero.
— sunaku

3
Puede enumerar todas las zonas horarias ejecutando rake time:zones:all. También vea rake -D time. Establezca la zona horaria predeterminada en config/application.rb.
— user664833

1
@AdamEberlin En Rails usualmente usa ActiveSupport :: TimeWithZone, no DateTime. Todo este código funciona tanto en objetos Ruby DateTime como en objetos Time.
— Mckeed

6

si Time.zonees su zona horaria deseada, puede usar@date.to_time.to_datetime

> @date
=> Tue, 02 Sep 2014 23:59:59 +0000
> @date.class
=> DateTime
> @date.to_time
=> 2014-09-02 12:59:59 -1100
> @date.to_time.to_datetime
=> Tue, 02 Sep 2014 12:59:59 -1100 

No funciona en Rails 5 `Time.zone # => Europe / Paris my_date # => Wed, 29 Mar 2017 19:00:20 +0200 my_date.to_time # =>" 2017-03-29T17: 00: 20.000+ 00:00 "my_date.to_time.to_datetime # => Mié, 29 de marzo de 2017 17:00:20 +0000`
— Cyril Duchon-Doris

5

En rubí simple, con solo require 'date', use el new_offsetmétodo:

require 'date'

d=DateTime.parse('2000-01-01 12:00 +0200')
l=d.new_offset('-0700')
u=l.new_offset('UTC')
puts "#{u.strftime('%a %F %T %Z')} ❖ #{l.strftime('%a %F %T %Z')}"

Probado con ruby ​​2.3.7 que viene de serie en Mac OS X 10.13.


3

Pruebe los objetos TimeWithZone de ActiveSupport manipulados con TimeZone. ActiveSupport también proporciona el método in_time_zone para convertir una hora UTC en una zona horaria específica. La respuesta de mckeed muestra el código.


¿Cuál es la sintaxis para importar TimeWithZone a mi clase? ¿O lo obtengo por defecto con Rails?
— Drew Johnson

1
Creo que lo obtienes por defecto. mckeed tiene el código que necesita, pero no lo verá en irb. Necesitas ejecutarlo en Rails.
— Fred

Tienes razón, gracias Fred, viene con Rails por defecto. Estaba agarrando pajitas, tratando de que funcionara en irb.
— Drew Johnson

3

Por si acaso, si se trata de un objeto ActiveRecord en Rails.

Puede ser una buena idea utilizar Time.use_zoneuna zona horaria por solicitud que anule la zona horaria predeterminada establecida enconfig.time_zone

Más detalles que explico en https://stackoverflow.com/a/25055692/542995


0

Estoy usando simple_form en Rails 4 y acabo de agregar el campo de entrada como

<%= f.input :time_zone, :as => :time_zone %>

con la migración

class AddTimeZoneColumnToTextmessage < ActiveRecord::Migration
  def change
    add_column :textmessages, :time_zone, :string
  end
end

1
Esto no responde a la pregunta de cómo convertir objetos DateTime
— zykadelic
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.