Rails 4 - обработка даты и времени

Я испытываю странные вещи при работе с Datetime в Rails.

  • В моих моделях используется столбец datetime, использующий Postgres.

  • Часовой пояс моего приложения установлен на Central America. Тем не менее, я работаю в тайваньском часовом поясе (на случай, если это имеет значение).

  • Для выбора дат в моих формах я использую сборщик гемов bootstrap-datetime Eonasdan.

Согласно документации гема, я перезаписал date_select и datetime_select методы Rails следующим образом:

config / initializers / form.rb:

# Add to config/initializers/form.rb or the end of app/helpers/application_helper.rb
module ActionView
  module Helpers
    class FormBuilder 
      def date_select(method, options = {}, html_options = {})
        existing_date = @object.send(method) 
        formatted_date = existing_date.to_date.strftime("%F") if existing_date.present?
        @template.content_tag(:div, :class => "input-group date") do    
          text_field(method, :value => formatted_date, :class => "form-control datepicker", :"data-date-format" => "DD/MM/YYYY") +
          @template.content_tag(:span, @template.content_tag(:span, "", :class => "fa fa-calendar") ,:class => "input-group-addon")
        end
      end

      def datetime_select(method, options = {}, html_options = {})
        existing_time = @object.send(method) 
        formatted_time = existing_time.to_time.strftime("%F %I:%M %p") if existing_time.present?
        @template.content_tag(:div, :class => "input-group date") do    
          text_field(method, :value => formatted_time, :class => "form-control datetimepicker", :"data-date-format" => "DD/MM/YYYY hh:mm A") +
          @template.content_tag(:span, @template.content_tag(:span, "", :class => "fa fa-calendar") ,:class => "input-group-addon")
        end
      end
    end
  end
end

На мой взгляд, в активах javascript я использую datepicker следующим образом, используя класс:

$(function () {
    $('.datetimepicker').datetimepicker({
        format: 'LLL',
        locale: 'es',
        icons: {
                    time: "fa fa-clock-o",
                    date: "fa fa-calendar",
                    up: "fa fa-arrow-up",
                    down: "fa fa-arrow-down",
                    previous: 'fa fa-arrow-left',
                    next: 'fa fa-arrow-right'
                }
        //useCurrent: false,
        //showTodayButton: true
    });
});

Как видите, я использую специальный языковой стандарт и формат для отображения даты в поле.

Обработка date (с использованием date_select) не вызывает никаких проблем. Но управление временем datetime сводит меня с ума.

Например:

  1. Я использую datetime_select (с выбором даты и времени), чтобы выбрать дату: 15/02/2016 04:00 PM.

  2. Сохраняю запись в базе данных. Однако, когда я проверяю запись с помощью консоли, сохраняемое значение datetime равно 2016-02-15 22:00:00. Это та же дата, но в другое время (22:00). Что происходит?

  3. На мой взгляд, я визуализирую дату, используя следующее:

    I18n.localize(mydate.to_s.to_datetime, :format => '%d/%m/%Y %I:%M %p')

Что отображает дату точно так, как она была введена при вводе: 15/02/2016 04:00 PM. Что происходит ?!


person Andres    schedule 23.12.2015    source источник
comment
Хайме, как ты решил эту проблему? Я столкнулся с этим сейчас, и это сводит меня с ума. Когда он доходит до formatted_time, он уже облажался из-за формата existing_time, поэтому я не могу сделать ничего полезного в строке formatted_time. Я думал об использовании гема moment.js / american_date, но предпочел бы этого избежать.   -  person Sean Magyar    schedule 07.01.2016
comment
Привет, @SzilardMagyar. В конце концов я понял, что на самом деле мне не нужно хранить дату в формате, отличном от UTC. Поскольку Rails выполнит соответствующее преобразование в правильный формат времени при получении значений. Моя проблема заключалась в том, что в конфигурации плагина DatePicker были некоторые ошибки, которые отображали неверное значение datetime.   -  person Andres    schedule 11.01.2016


Ответы (1)


По умолчанию ActiveRecord сохраняет столбцы datetime в базе данных в формате UTC. Он преобразует записи datetime в / из UTC при сохранении / загрузке записи. Если вы хотите сохранить отметки времени в том же часовом поясе, что и часовой пояс вашего приложения, вы можете добавить config.active_record.default_timezone = :local в application.rb

person infused    schedule 23.12.2015
comment
Я попытался добавить этот код прямо под config.time_zone, но похоже, что он все еще не работает. Время, отображаемое на консоли рельсов, все еще отличается. Вы упомянули временные метки, но я использую datetime. Не уверен, что это имеет значение .... - person Andres; 23.12.2015