【发布时间】:2012-04-19 14:47:25
【问题描述】:
(我的问题与described in this question 几乎相同,只是那个答案在我的情况下不起作用。)
我在带有 Postgres 数据库的 Rails 应用程序中使用 jQuery UI Datepicker。默认实现使用 mm/dd/yy 日期格式来显示所选日期,这正是我想要的。但是,在我将记录保存到数据库后,月份和日期会反转 - 然后显示为 yy-dd-mm。因此,选择 3/11/2012 会尝试保存为 11 月 3 日而不是 3 月 11 日,并且像 3/31/2012 这样的日期根本不会保存,因为它不存在。
到目前为止,我已经尝试了 3 种不同的方法来解决这个问题:
1) 第一次尝试是重新格式化文本字段,使显示看起来像我想要的那样:
<%= f.text_field :foo, :value => (@model.foo.blank? ? '' : @model.foo.strftime('%m/%d/%Y')), class: "datepicker" %>
最初正确显示 2012 年 3 月 31 日,但保存时仍显示相反。
2) 所以接下来我尝试更改存储日期的默认方式,认为这样可以解决问题。如this question 的回答中所述,我在 config/locales/en.yml 中添加了以下内容:
# config/locales/en.yml
en:
date:
formats:
default: "%m/%d/%Y"
这根本没有任何区别。接下来我找到this question 并尝试使用这些行创建 config/initializers/date_formats.rb:
Date::DATE_FORMATS[:default]="%m/%d/%Y"
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M"
同上,没有区别。
3) 在玩了很多组合之后,我发现 DID 工作的一件事是在我对 datepicker 插件的调用中指定 yyyy-mm-dd 格式 - 这与我想要的相反,但至少日期可以成功保存。所以 datepicker 调用看起来像这样:
$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });
从日历中选择 3 月 31 日会在字段中填充 2012-03-31,保存后仍显示为 2012-03-31。
但是我到底怎样才能让日期选择器使用 mm/dd/yy 格式呢?我无法想象这是一件困难的事情,但我错过了什么?我是否必须对日期在 Postgres 中的存储方式做些什么? (它们被指定为日期,而不是日期时间。)
【问题讨论】:
-
为了停止在这个问题上撞墙,我刚刚将我的字段切换为“文本”而不是“日期”。这并不理想,但确实可以相当简单地解决问题。
-
有时切换是一个很好的解决方案,无论它是否理想。但仍然出于好奇,您可能想知道问题所在,可能会在以后。
-
Rails 3.2.3、Postgresql 和 Ruby 1.9.3。我将 datepicker 格式设置为 mm-dd-yy 并且它工作了一段时间,但我正在进行重构,我可以毫不费力地保存一些日期,但特别是不再保存一个日期。所以我要重新格式化回 yy-mm-dd 看看会发生什么。
-
更新:我在 datepicker 调用中尝试了 yy-mm-dd 格式,但仍然得到“日期不能为空”。我很困惑,但是由于没有其他解决方案,我将运行迁移来更改日期的数据类型,也可以像您所做的那样更改文本……希望我或某人能找到解决方案。
-
我的经历几乎完全相同,结果也一样。在 Rails 3.0 中对我有用的是 Date::DATE_FORMATS[:default],但是,在升级到 Rails 3.2 后,这不再有效。就我而言,我认为问题归结为:
"01/03/13".to_date.to_s --> "03/01/13"这似乎很愚蠢
标签: ruby-on-rails-3 postgresql date format jquery-ui-datepicker