Rails 4 - 处理日期时间

Rails 4 - Handling Datetime

我在 Rails 中处理日期时间时遇到奇怪的事情。

根据 gem 的 documentation,我已经覆盖了 Rails' date_selectdatetime_select 方法,如下所示:

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 资产中,我使用这样的日期选择器,使用 class:

$(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(带日期时间选择器)select 一个日期:15/02/2016 04:00 PM.

  2. 我将记录保存在数据库中。但是,当我使用控制台查看记录时,存储的日期时间值为 2016-02-15 22:00:00。这是相同的日期但不同的时间(晚上 10 点)。 这是怎么回事?

  3. 在我看来,我使用以下方式呈现日期:

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

它准确地呈现输入期间输入的日期:15/02/2016 04:00 PM这是怎么回事?!

ActiveRecord 默认将数据库中的日期时间列保存为 UTC。当您 save/load 一条记录时,它将转换日期时间记录 to/from UTC。如果要将时间戳保存在与应用程序时区相同的时区,可以将 config.active_record.default_timezone = :local 添加到 application.rb