2010-07-09 20 views
13

Obtengo una cadena de un método externo con fecha y hora como "07/09/10 14:50" ¿hay alguna forma de que pueda convertir ese tiempo en rubí a 'Pacífico EE.UU.' sabiendo su hora 'UTC'? con cambios contabilizados en la fecha? Es decir, si la diferencia de tiempo hace que el día sea diferente.Tiempo de conversión en UTC a hora del Pacífico

+0

Por favor refiérase a la que he publicado https://stackoverflow.com/questions/24577449/convert-time- to-other-timezone/44278155 # 44278155 –

Respuesta

36

Dado que parece que está utilizando raíles, tiene bastantes opciones. Sugiero leer this article que habla de husos horarios.

Para convertir a PST, ambos son métodos específicos de raíles. No hay necesidad de reinventar la rueda:

time = Time.parse("07/09/10 14:50") 
time.in_time_zone("Pacific Time (US & Canada)") 

Esperanza esto ayuda

ACTUALIZACIÓN: Carriles podría tratar de ser más listos y dar la hora que se especifica como una cadena de una zona horaria. Para asegurar que el tiempo analiza como UTC, usted debe especificar en la cadena:

time = Time.parse("07/09/10 14:50 UTC") 
time.in_time_zone("Pacific Time (US & Canada)") 
+0

He echado un vistazo al artículo, pero dosent muestra cómo puedo convertir de forma de cadena a objeto de fecha u hora? el método dosent funciona si lo llamo en la cadena "07/09/10 14:50" –

+0

Agregué la instrucción 'Time.parse' para obtener la hora de una cadena. –

13

convertir de formato de cadena a un objeto de fecha o el tiempo que necesita utilizar strptime

require 'date' 
require 'time' 

my_time_string = "07/09/10 14:50" 
to_datetime = DateTime.strptime(my_time_string, "%m/%d/%y %H:%M")  

utc_time = Time.parse(to_datetime.to_s).utc 
pacific_time = utc_time + Time.zone_offset("PDT") 

puts utc_time 
puts pacific_time 

Este es el rubí puro , por lo tanto, es probable que haya algunos métodos específicos para los raíles que pueda usar específicamente para esta tarea, pero esto debería ayudarlo a comenzar.

+1

Una pequeña nota, probablemente debería usar 'utc_time + Time.zone_offset (" PDT ")' en su lugar, si el desplazamiento de zona es negativo, p. -18000 "hará" menos menos ", lo que resulta en un número positivo, y por lo tanto dará como resultado una adición que no es lo que desea. – Ole

+0

Modificado, gracias por notar. – michaelmichael

+0

Me pregunto si' PST' no lo haría ser una mejor opción considerando 'PDT' devuelve el horario de verano y' PST' devuelve la hora estándar. Actualmente, la conversión de una hora 'UTC' con el desplazamiento' PDT' no devolvería la hora actual del Pacífico. (Ejemplo: actualmente es 1pm UTC. La conversión usando PDT le daría las 6 a.m., pero PST le daría las 5 a.m., que es probablemente lo que espera). – Pauline

-4

requieren 'tiempo'

Si desea hora del Pacífico simplemente restar 25200 segundos de Time.new Hay una diferencia 7 horas entre la hora del Pacífico y GMT.

t = Time.parse ((Time.new-25200) .to_s)

A continuación, utilice strftime para formatear sin embargo usted quiere que se vea.

pone t.strftime ("% A% D en% I:% M% p")

+1

Es muy desaconsejable manejar las zonas horarias manualmente. Elanguage tiene las mejores herramientas para eso. ¿Consideró el DST? ? Saltos? –

+0

No solo desaconsejado, pero en este caso MUERTO INCORRECTO. Restando un tiempo fijo de una fecha para convertir las zonas horarias ignora el horario de verano – Scott

+0

Me acabo de dar cuenta de por qué el código anterior no funcionaba yo. Estoy usando el servidor de cloud 9 debe estar en otra zona horaria. Agregué el lenguaje Ruby para eclipsar y luego agregué el siguiente código y me da la hora actual en PST. time = Time.new() pone el tiempo.strftime ("% I:% M:% S") –