2012-10-05 19 views
10

In Rails, sono un po 'confuso sulla guida tra quando utilizzare DateTime.now.utc e Time.current. Sembrano esserci opinioni divergenti all'interno del framework su quale sia il migliore, in particolare nelle diverse versioni.Quando deve essere usato `DateTime.now.utc` vs.` Time.current.utc` in Rails?

Sembra DateTime.now.utc produce un timestamp con un offset zeroUTC, mentre Time.current.utc produce un timestamp con un fuso orario UTC. Sembra una sottile distinzione, ma è piuttosto importante in molti casi (ad es. Calcoli di DST).

Quando utilizzare DateTime.now.utc e quando si deve utilizzare Time.current.utc? C'è qualche ragione per usare DateTime.now.utc invece di Time.current.utc?

+0

Puoi dare un esempio di dove fa la differenza? Dato che UTC non ha transizioni per l'ora legale, sicuramente fa la differenza quando inizi a utilizzare altri fusi orari ... (Non conosco Ruby, ma ho fatto un bel po 'di roba data/ora, quindi con più background potrei essere in grado di aiutarti.) –

+0

@JonSkeet: non so se faccia la differenza. (Ecco perché sto chiedendo quale dovrei usare!) 'DateTime.now.utc' prima richiama' DateTime.now', e quindi inverte l'offset UTC per arrivare all'ora "UTC". Quindi notate che non si traduce tra _time zones_, ma piuttosto tra _offsets_. Potrebbe essere problematico nei casi limite, ad esempio, l'infame esempio 1927-1928 a Shanghai? –

+0

@JonSkeet: a meno che non si sia effettivamente in UTC, quindi "DateTime.now' e" Time.current "producono entrambi un'ora locale in qualcosa di diverso da UTC. In altre parole, sembrano differire nei loro approcci su come si convertono in UTC - lo si fa applicando un offset in modo diretto; l'altro esegue effettivamente i calcoli del fuso orario nel nuovo fuso orario di UTC. –

risposta

30

Penso che dovresti usare .current invece di .now.

La differenza di .current e .now è .now utilizzare fuso orario del server, mentre .current uso ambiente ciò che il Rails è impostato. Se non è impostato, allora .current sarà uguale a .now.

Time.current

Returns Time.zone.now quando Time.zone o config.time_zone sono impostati, altrimenti solo restituisce Time.now.

Datetime.current

Returns Time.zone.now.to_datetime quando Time.zone o config.time_zone sono impostati, altrimenti restituisce Tempo. now.to_datetime.

+0

come su Date.current e Date.today sono le stesse? – ajahongir

+0

Qual è la differenza tra "Time.now.in_time_zone' e" Time.current'? –

+0

@pinouchon Sono gli stessi, entrambi restituiscono l'istanza di 'ActiveSupport :: TimeWithZone'. – xdazz

Problemi correlati