Rails 4 - 处理日期时间
Rails 4 - Handling Datetime
我在 Rails 中处理日期时间时遇到奇怪的事情。
在我的模型中,我有一个使用 Postgres 的 datetime
列。
我的应用程序的时区设置为 Central America
。但是,我在台湾时区开发(以防有差异。)
我正在使用 Eonasdan's bootstrap-datetime 选择器 gem fork select 在我的表单中输入日期。
根据 gem 的 documentation,我已经覆盖了 Rails' date_select
和 datetime_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
的时间让我发疯。
例如:
我使用 datetime_select
(带日期时间选择器)select 一个日期:15/02/2016 04:00 PM
.
我将记录保存在数据库中。但是,当我使用控制台查看记录时,存储的日期时间值为 2016-02-15 22:00:00
。这是相同的日期但不同的时间(晚上 10 点)。 这是怎么回事?
在我看来,我使用以下方式呈现日期:
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
我在 Rails 中处理日期时间时遇到奇怪的事情。
在我的模型中,我有一个使用 Postgres 的
datetime
列。我的应用程序的时区设置为
Central America
。但是,我在台湾时区开发(以防有差异。)我正在使用 Eonasdan's bootstrap-datetime 选择器 gem fork select 在我的表单中输入日期。
根据 gem 的 documentation,我已经覆盖了 Rails' date_select
和 datetime_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
的时间让我发疯。
例如:
我使用
datetime_select
(带日期时间选择器)select 一个日期:15/02/2016 04:00 PM
.我将记录保存在数据库中。但是,当我使用控制台查看记录时,存储的日期时间值为
2016-02-15 22:00:00
。这是相同的日期但不同的时间(晚上 10 点)。 这是怎么回事?在我看来,我使用以下方式呈现日期:
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