2011-11-02 7 views
12

Come posso ottenere un oggetto Tempo rubino che rappresenta l'inizio del giorno in una data specifica in un determinato fuso orario.Ottiene l'oggetto orario all'inizio del giorno in un fuso orario particolare

+0

Solo un commento in quanto non so nulla sulla gestione del fuso orario di Ruby: la mezzanotte non esiste sempre e potrebbe verificarsi due volte. Il Brasile cambia i suoi orologi a mezzanotte, per esempio. Probabilmente dovresti trovare l'inizio della giornata, invece. –

+0

Punto interessante. Per i miei scopi l'inizio della giornata è quello che mi interessa. Grazie Jon. Aggiornerò la domanda –

+0

Qual è il tuo caso di utilizzo effettivo? (Ho trovato questa domanda perché volevo ottenere la mezzanotte più recente in California, come UTC, per il monitoraggio delle quote API.) –

risposta

6

ho finito con il metodo #local sulla ActiveSupport::TimeZone oggetto p Assing componenti dell'oggetto Date.

# Get example date and time zone... 
date = Date.today 
timezone = ActiveSupport::TimeZone['America/New_York'] 

# Get beginning of day for date in timezone 
timezone.local(date.year, date.month, date.day) 
10
date = Date.today 

date.to_time.in_time_zone('America/New_York').beginning_of_day 

Attualmente uscite => 2011-11-02 00:00:00 -0400

Time.now.in_time_zone('Asia/Shanghai').beginning_of_day 

Attualmente uscite => 2011-11-03 00:00:00 +0800

date = Date.today 

date.to_time.in_time_zone('Asia/Shanghai').beginning_of_day 

Attualmente uscite => 2011-11-02 00:00:00 +0800

+1

Vorrei che fosse così semplice. Sfortunatamente, non vi è alcuna garanzia che l'orario di arrivo, dopo la conversione del fuso orario, sia nello stesso giorno. A volte lo sarà ea volte non dipenderà dalla zona iniziale e finale. Suppongo che potrei confrontare il componente della data dopo la conversione con il valore originale e aggiustarlo se necessario, ma è davvero goffo. Quello che mi piacerebbe è un modo elegante per farlo che funziona sempre. Spero che ci sia qualcosa nell'api, non penso che sia una cosa pazza da voler fare. –

+0

Potrei non capire completamente cosa stai cercando di fare ma 'date.to_time.in_time_zone ('TIMEZONE'). Beginning_of_day' ti da 00:00:00 UTC per la data specificata originale. –

+1

Non ti dà 0 UTC, ti dà 0 nel fuso orario, che è preferibile. Ma non lo fa prima di convertire i fusi orari con in_time_zone, quindi la data non è necessariamente più valida. Ecco un esempio di ciò che intendo. 'date.to_time.in_time_zone ('Asia/Shanghai'). midnight.in_time_zone (Time.zone) .midnight # => Un giorno nel passato. Idealmente, il rubino dovrebbe permettermi di fare qualcosa del genere. 'Date.to_time (zona)'. –

5

Non sono sicuro se questo aiuta, ma questo mi ottiene il momento in cui le mie quote API di Google ripristinati:

# The most recent midnight in California in UTC time 
def last_california_midnight 
    (Time.now.utc - 7.hours).midnight + 7.hours 
end 

Io lo uso come questo con Mongoid, ad esempio:

def api_calls_today 
    Call.where(updated_at: { '$gte' => last_california_midnight }).count 
end 

Questo funzionerà indipendentemente dal fuso orario in cui viene distribuito il codice, a condizione che Mongo sia impostato su UTC.