2013-08-09 4 views
8

Sto tentando di analizzare un datetime con la classe Time in Ruby 2.0. Non riesco a capire come analizzare la data e ottenerla in un fuso orario specificato. Ho utilizzato Time.zone.parse per analizzare una data in cui prima ho chiamato Time.zone e impostato su un fuso orario specificato. Nell'esempio seguente, ho impostato la zona ma non ha effetto strptime, ho provato a fare Time.zone.parse(date) ma non riesco a farmi analizzare una data come quella qui sotto.Tempo di analisi con timeout utilizzando Time.zone

Time.zone = "Central Time (US & Canada)" 
#=> "Central Time (US & Canada)" 
irb(main):086:0> Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p") 
#=> 2013-08-26 15:30:00 -0400 
+0

Per quanto ne so non c'è 'zone =' metodo di classe per 'Tempo'. Questo non fallisce con un 'NoMethodError'? – Borodin

+0

@Borodin Non c'è in Ruby, ma ActiveSupport ne aggiunge uno in. –

risposta

7

Time.zone non è una parte di Ruby, è una parte di ActiveSupport (che è incluso con Rails). In quanto tale, strptime non sa nulla di Time.zone. È possibile, tuttavia, convertire una normale Rubino Tempo in un ActiveSupport::TimeWithZone utilizzando in_time_zone, che utilizza il valore Time.zone 's di default:

require 'active_support/core_ext/time' 
Time.zone = 'Central Time (US & Canada)' 

time = Time.strptime('08/26/2013 03:30 PM', '%m/%d/%Y %I:%M %p') 
#=> 2013-08-26 15:30:00 -0400 
time.in_time_zone 
#=> Mon, 26 Aug 2013 14:30:00 CDT -05:00 
+0

@muistooshort Sì ... Se c'è una cosa che vorrei che ogni lingua avesse una buona e completa libreria standard Data/Ora. (Naturalmente, Ruby's è lontano dal peggio.) –

1

Se sei solo alla ricerca a Ruby2.0, si può trovare il tempo LIB utile:

require 'time' 
time.zone # return your current time zone 

a = Time.strptime("08/26/2013 03:30 PM","%m/%d/%Y %I:%M %p") 
# => 2013-08-26 15:30:00 +1000 
a.utc # Convert to UTC 
a.local # Convert back to local 
# Or you can add/subtract the offset for the specific time zone you want: 
a - 10*3600 which gives UTC time too 
0

strptime ottiene i suoi parametri dalla stringa del tempo. In quanto tale, la stringa temporale deve contenere informazioni sul fuso orario.

Se state analizzare le stringhe di tempo in un fuso orario specifico, ma le stringhe di tempo che si ricevono non lo avete incorporato - quindi è possibile aggiungere informazioni sul fuso orario prima di passare la stringa di tempo per srtptime, e chiedendo strptime di analizzare il fuso orario fuso utilizzando %z o nome utilizzando %Z.

In poche parole, se si dispone di una stringa di tempo 08/26/2013 03:30 PM e lo si vuole analizzato nella UTC fuso orario, si avrebbe:

str = '08/26/2013 03:30 PM' 
Time.strptime("#{str} UTC}", "%m/%d/%Y %I:%M %p %Z")