Perché `config.time_zone` non sembra fare nulla?

In application.rb , dice:

Imposta l’impostazione predefinita di Time.zone sulla zona specificata e triggers la conversione automatica in questa zona. Esegui “rake -D time” per un elenco di attività per trovare i nomi dei fusi orari. L’impostazione predefinita è UTC.

Ma impostando config.time_zone = 'Central Time (US & Canada)' o config.time_zone = 'Eastern Time (US & Canada)' non ha alcun effetto – il campo created_at in un modello è in fase di salvataggio in UTC.

Secondo questa risposta di railsforum :

config.time_zone consente solo ai binari di sapere che il tuo server è impostato su questo fuso orario, quindi quando scrive date nel database può convertirlo correttamente in UTC.

Se ciò è vero, allora perché è il momento in cui il mio sistema è Pacific Time (US & Canada) e config.time_zone = 'Central Time (US & Canada)' o config.time_zone = 'Eastern Time (US & Canada)' , che il tempo created_at è l’UTC corretto? Non dovrebbe essere sbagliato ?!

Perché, se l’ora PST è 8 PM, allora EST è 11 PM e UTC è 4 AM. Presumendo che Rails faccia Time.now , sarebbero le 20:00. E abbiamo detto a Rails che il server è in EST. Quindi, 8 PM sarebbe tempo EST per quanto riguarda Rails e l’ora UTC sarebbe 5:00 UTC, il che sarebbe errato (perché l’ora effettiva è 8 PM PST / 11 PM EST, che è 4 UT UTC)

Cosa sta succedendo qui?

Ecco una lista di concetti e cose che possono aiutarti:

config.time_zone non imposta “Server Time”, che di solito è controllato dal tuo sistema operativo.

Rails memorizza sempre le date in UTC nel database (a meno che non si modifichi un’impostazione diversa).

Time.now restituisce l’ora locale per il tuo computer nel tuo fuso orario e include anche l’offset del fuso orario locale dal tuo sistema operativo, il che significa che Ruby e quindi Rails sanno come convertire ora locale in UTC. Puoi provare questo utilizzando irb direttamente, quindi non vengono caricate librerie Rails:

 ctcherry$ irb >> Time.now => Mon Feb 21 20:53:14 -0800 2011 >> 

Se config.time_zone o Time.zone è impostato, per dire EST, Rails si aspetta che se si imposta un attributo datetime che si intende per data e ora in un fuso orario specificato, in questo caso EST. Questo è il motivo per cui hai impostato Time.zone uguale al fuso orario degli utenti finali, in modo che possano utilizzare l’ora locale e le date e puoi passarli direttamente nei modelli ActiveRecord e Rails può convertirlo in UTC per l’archiviazione nel database.

Questo aiuta affatto?

Devi usare in_time_zone (cioè Time.now.in_time_zone ) per ottenere qualcosa di diverso da UTC.