2016-07-14 2 views
0

Я оставил свой application.rb как есть, и по умолчанию он хранит дату и время в UTC.Как конвертировать datetime для каждого пользователя

Теперь на уровне пользовательского интерфейса (только для отображения) Я хочу преобразовать дату и время в пользовательский часовой пояс.

Как я могу преобразовать UTC datetime, которое я получаю из postgresql, а затем преобразую его в часовой пояс, который я буду хранить для каждого пользователя.

Я хочу сделать это преобразование с помощью смещения, так как: -5:00 or +4:00

Это нормально, чтобы сделать это, потому что я просто проверял некоторые места и, кажется, их смещение изменения в течение сезона.

E.g. virginia идет от UTC -5 до UTC -4 в зависимости от месяца. http://www.timeanddate.com/time/zone/usa/richmond

If UTC is not consistant then I should just store the zone in the database for each user? 
+0

Вы можете использовать Time.current ... проверить это - http://apidock.com/rails/Time/current/class – Milind

ответ

1

Когда я сделал приложение с планированием событий, я должен был добавить к часовым поясам модели пользователя, чтобы компенсировать их планирование.

Когда я записывал смещение, я использовал следующий код:

<%= time_zone_select "user", 
        "timezone", 
        ActiveSupport::TimeZone.us_zones, 
        {default: "Mountain Time (US & Canada)"}, 
        {class: "form-control"} %> 

Поскольку Rails имеет time zones built into their ActiveSupport model. Вы можете использовать ActiveSupport::TimeZone.all, если вы хотите, чтобы пользователи глобальной.

Вот некоторая информация о time_zone_select

Затем, в зависимости от того, как вы используете его, вы можете просто установить

Time.zone = current_user.timezone unless current_user.nil? 

или что-то подобное в вашем файле application.rb.

UPDATE

Я лично использовал его, чтобы установить часовой пояс в контроллере на только 2 действия, где это было необходимо.

def index 
    @user = current_user 
    @pending = @user.share_events.where("time > ?", DateTime.now.in_time_zone(@user.timezone)) 
    @complete = @user.share_events.where("time <= ?", DateTime.now.in_time_zone(@user.timezone)) 
end 

def new 
    @user = current_user 
    Time.zone = @user.timezone 
    @post = Post.find(params[:post_id]) 
    @share_event = ShareEvent.new 
end 
+0

application.rb должен остаться UTC, только тогда, когда я показываю вещи в UI следует преобразовать дату и время в пользовательский часовой пояс. – Blankman

+0

Могу ли я увидеть, как вы на самом деле конвертировали часовой пояс UTC, который находится от вашего db до конкретного пользователя? – Blankman

+1

Ответ обновлен, чтобы показать два способа использования часовой пояс UTC. – Okomikeruko

Смежные вопросы