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
risposta
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)
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
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. –
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. –
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)'. –
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.
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. –
Punto interessante. Per i miei scopi l'inizio della giornata è quello che mi interessa. Grazie Jon. Aggiornerò la domanda –
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.) –