2015-04-22 26 views
5

Non mi riferisco aIn Ruby o Rails, qual è il modo migliore per convertire Eastern Time in UTC?

myDateTime = DateTime.now 
myDateTime.new_offset(Rational(0, 24)) 

o

Time.now.utc 

Quello che ho è una data di testo è dato in Eastern Time.

Posso convertire quella data di testo in un DateTime. Chiamiamolo eastern_date_time.

Ora, abbiamo una variabile contenente un DateTime, ma nulla sa che è orientale oltre a noi. Convertire noi stessi sarebbe abbastanza oneroso. Se la data in Ora legale (ora legale) (dall'8 marzo al 1 ° novembre di quest'anno), dovremmo aggiungere 4 ore alla nostra variante eastern_date_time per ottenere UTC, e se la data è in Ora standard (ST) aggiungere 5 ore alla nostra variabile eastern_date_time.

Come possiamo specificare che quello che abbiamo è un Eastern DateTime, e quindi convertirlo in UTC ... qualcosa che determinerà se la data è in DST/ST, e applicare correttamente le 4 o 5 ore?

Voglio convertire qualsiasi data in cui arrivo in UTC, per l'archiviazione nel mio database.

EDIT:

Utilizzando `in_time_zone', io sono in grado di convertire il mio tempo testo orientale UTC. Come posso raggiungere questo obiettivo? Ad esempio ...

text_time = "Nov 27, 2015 4:30 PM" #given as Eastern 
myEasternDateTime = DateTime.parse text_time # => Fri, 27 Nov 2015 16:30:00 +0000 
#now we need to specify that this myEasternDateTime is in fact eastern. However, it's our default UTC. If we use in_time_zone, it just converts the date at UTC to Eastern 
myEasternDateTime.in_time_zone('Eastern Time (US & Canada)') # => Fri, 27 Nov 2015 11:30:00 EST -05:00 
myEasternDateTime.utC# => Fri, 27 Nov 2015 16:30:00 +0000 

Questo non è quello che vogliamo. Dobbiamo specificare che myEasterDateTime è in effetti est ... in modo che quando facciamo un myEasterDateTime.utc alle 16:30:00 finiamo per ricevere 20:30:00.

Come posso realizzare questo?

risposta

1

ho ricevuto in questo modo, con l'aiuto del suggerimenti sul fuso orario.

time_text_1 = "Apr 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included 
time_text_2 = "Nov 20, 2015 4:30PM" #Scraped as an Eastern Time, with no offset of -5:00 from UTC included 

Time.zone = 'Eastern Time (US & Canada)' 
my_time_1 = Time.zone.parse time_text_1 # Output: Mon, 20 Apr 2015 16:30:00 EDT -04:00 
my_time_2 = Time.zone.parse time_text_2 # Output: Fri, 20 Nov 2015 16:30:00 EST -05:00 

my_time_1.utC# Output: 2015-04-20 20:30:00 UTC 
my_time_2.utC# Output: 2015-11-20 21:30:00 UTC 
2

c'era un time_in_zone method in the DateTime class:

now.time_in_zone('UTC') 

Da allora è stato renamed to in_time_zone:

DateTime.now.in_time_zone('US/Pacific') 
=> Wed, 22 Apr 2015 12:36:33 PDT -07:00 
+0

dove è possibile ottenere un elenco di tutti i fusi orari quali "Stati Uniti/Europa orientale". C'è un comando? –

+1

'ActiveSupport :: TimeZone.zones_map.values.collect {| z | z.name} ' – hd1

+0

Non riesco a capire come convertire la Eastern Text Date in Eastern Time e quindi ottenere l'equivalente UTC con il metodo in_time_zone. Ho aggiunto un EDIT al post originale. –

1

Gli oggetti della classe Tempo sono un metodo chiamato dst? che fondamentalmente ti dice se l'ora legale è in vigore o non. In pratica, puoi identificare se DST/ST è applicabile e decidere quale aggiungere - 4 o 5.

ad es. Time.now.dst? Se restituisce vero, aggiungere 4, altrimenti aggiungere 5.

+0

Puoi trovare ulteriori informazioni qui - http://apidock.com/rails/ActiveSupport/TimeWithZone/dst%3F – Jerry

1

Nel messaggio modificato, la stringa di tempo ha bisogno di un offset da UTC.

EDIT III: Sulla base dei commenti (solo con una stringa impostata per rappresentare Eastern Time e che hanno bisogno di tenere conto di ora legale, ecc)

text_time = "Nov 27, 2015 4:30 PM" 
the_offset = Time.zone_offset('EST')/(60*60) 
eastern_time = DateTime.parse(text_time).change(offset: the_offset.to_s) # Fri, 27 Nov 2015 16:30:00 -0500 
eastern_time.utC# Fri, 27 Nov 2015 21:30:00 +0000 
+0

molto vicino sì, è solo che il testo che mi è stato passato non contiene un offset. È solo una data di testo che si presume essere ET. –

+0

Ok. Modifica la risposta per l'account per quello –

+0

sfortunatamente anche questo non fa il lavoro, dato che l'ora dell'est non è sempre -5 da UTC (http://www.nhc.noaa.gov/aboututc.shtml - ultima frase nell'ultimo paragrafo prima dell'immagine). Durante l'ora legale è -4, ma durante ST è -5. L'unico modo in cui sono stato in grado di farlo fino ad ora, è nella risposta che ho postato a questa domanda originale, ma non è molto pulita. Sono un paio di righe, ma come puoi vedere gestisce gli DST (20 aprile 2015 per esempio) e gli ST (20 novembre 2015 per esempio). Ad ogni modo posso ripulirlo? –

Problemi correlati