2012-11-14 12 views
15

per un po 'sto cercando di capire come questi tempi timezone lavoreranno, e ho avuto una domanda:Rails fuso orario e l'ora legale

Oggi nel mio paese, siamo in ora legale (GMT-2). Quindi l'utente della mia domanda immette un orario, come 11:00 AM e pubblica il modulo. Per quanto ne so, i binari convertono questa data in UTC e salvano nel database (mysql nel mio caso), come ad esempio: 01:00 PM UTC.

Quando ho recuperato quel record, ho dovuto convertire in ora locale per la visualizzazione. Ok?

La mia domanda è, supponiamo che questa data/ora rappresenti una data/ora in futuro, quando il mio paese uscirà dall'ora legale (GMT-3). Rails salverà 01:00 PM UTC? Oggi, con l'ora legale, come sarà l'ora locale? E in futuro, come sarà questa volta locale?

Fondamentalmente, ho sempre bisogno di visualizzare all'utente 11:00 AM.

grazie.

risposta

2

7 mesi dopo aver chiesto, ma forse skip_time_zone_conversion_for_attributes = aiuterà - dice ad AR di non convertire i fusi orari in memoria o recupero. Vedere [ActiveRecord timestamp] (http://api.rubyonrails.org/classes/ActiveRecord/Timestamp.html), che mostra l'esempio:

class Topic < ActiveRecord::Base 
    self.skip_time_zone_conversion_for_attributes = [:written_on] 
end 

--Kip

13

Esistono diversi luoghi in cui il fuso orario può entrare in gioco: l'impostazione predefinita del sistema operativo (o probabilmente l'account utente), il server del database, Rails environment.rb.

La chiave è assicurarsi che tutte le date siano memorizzate con fuso orario UTC, quindi visualizzate in qualsiasi fuso orario locale. Sembra che tu lo stia facendo.

Così la tua domanda sembra ridursi a "se è l'ora legale, voglio compensare per -3 ore, altrimenti compensata per -2 ore". Le estensioni temporali di Rails ti permettono di determinare il tuo attuale offset come Time.zone.now.utc_offset e Time#dst? ti dice se è ora legale con quei due che puoi sottrarre condizionatamente l'ora in più (3600 cento secondi).

+1

Quindi, si tratta di una questione di visualizzazione, sempre. In questo caso, tutti i valori di data passati a un parametro di filtro devono essere convertiti in UTC. – Beetlejuice

+1

Questo è il modo giusto per pensarci, anche se forse la mia scelta di parole "visualizzate" non è stata utile. Ho avuto un caso poche settimane fa in cui un partner ha eseguito un lavoro alle 2 del mattino (indipendentemente dall'offset dell'ora legale), il che significa che dovevamo coordinarci con quello. In realtà non importa quale fuso orario la data viene memorizzata come * purché contenga il fuso orario * - se conosci il tuo fuso orario e quello della data memorizzata, hai tutto il necessario per regolare l'ora e visualizzarla tuttavia è necessario. Memorizzare le date come UTC (e impostare i sistemi in UTC) rende tutto più semplice. –

+0

Bene, supponiamo che ora siamo in DST e salviamo un record alle 8:00 ora locale. Ciò salverà un 10am utc nel database. In un'altra mano, supponiamo che ora sia il tempo normale e salviamo un record alle 8:00 ora locale, salvando 11am utc nel database. Non è possibile visualizzare entrambi i record come 8am per l'utente. Ora, se impostiamo tutto su UTC funzionerà. – Beetlejuice