Rails3/jQuery UI Datepicker - 保存时反转月和日

ell*_*ren 14 format postgresql date jquery-ui-datepicker ruby-on-rails-3

(我的问题几乎和这个问题中描述的一样,只有答案在我的情况下不起作用.)


我在带有Postgres数据库的Rails应用程序中使用jQuery UI Datepicker.默认实现使用mm/dd/yy日期格式来显示所选日期,这正是我想要的.但是,在将记录保存到数据库后,月份和日期相反 - 然后显示为yy-dd-mm.所以选择3/11/2012尝试保存为11月3日而不是3月11日,并且根本没有保存像2012年3月31日这样的日期,因为它不存在.

到目前为止,我已经走了三条不同的途径试图解决这个问题:

1)首次尝试重新格式化文本字段,以便显示我的想法:

<%= f.text_field :foo, :value => (@model.foo.blank? ? '' : @model.foo.strftime('%m/%d/%Y')), class: "datepicker" %>
Run Code Online (Sandbox Code Playgroud)

最初正确显示03/31/2012,但保存时仍然反转.

2)接下来我尝试更改存储日期的默认方式,认为可以解决问题.正如在这个问题的答案中所描述的,我在config/locales/en.yml中添加了以下内容:

# config/locales/en.yml
en:
  date:
    formats:
      default: "%m/%d/%Y"
Run Code Online (Sandbox Code Playgroud)

这根本没有任何区别.接下来我发现了这个问题并尝试使用以下行创建config/initializers/date_formats.rb:

Date::DATE_FORMATS[:default]="%m/%d/%Y"
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M"
Run Code Online (Sandbox Code Playgroud)

同上,没有区别.

3)在玩了很多组合之后,我发现DID工作的一件事是在我调用datepicker插件时指定了yyyy-mm-dd格式 - 它与我想要的相反,但至少日期可以是成功保存.所以datepicker调用如下所示:

$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });
Run Code Online (Sandbox Code Playgroud)

从日历中选择3月31日将使用2012-03-31填充该字段,并在保存后仍显示为2012-03-31.

但是我怎样才能让日期选择器以mm/dd/yy格式工作?我无法想象这是一件困难的事情,但我错过了什么?我是否必须对Postgres中的日期存储方式做些什么?(它们被指定为日期,而不是日期时间.)

hit*_*ani 3

那么这取决于您如何在数据库中存储数据。如果您碰巧使用RAW sql 查询,则可以to_date('31 Mar 2012', 'DD Mon YYYY')在插入查询中使用。

Postgres 的to_date 参考

现在,在您的客户端,您可以在 jquery 日期选择器中使用

$.datepicker.formatDate('dd-M-yy', Yourdate);
Run Code Online (Sandbox Code Playgroud)

我使用 DD Mon YYYY 因为它看起来更清晰。mm/dd/yy您可以根据需要使用格式或其他格式。在这些情况下,请 在 postgre函数中使用所需的格式to_date

请注意,我没有测试上面的代码。如果有任何问题或您遇到任何麻烦,请发表评论。

编辑:

Date.parse('2011-06-18')您可以在将数据插入数据库并在日期选择器中设置之​​前在 Rails 视图formatDate中使用 'yy-mm-dd'