Ruby on rails 3 Rails3/jQuery UI Datepicker-保存时反转月份和日期

Ruby on rails 3 Rails3/jQuery UI Datepicker-保存时反转月份和日期,ruby-on-rails-3,postgresql,date,format,jquery-ui-datepicker,Ruby On Rails 3,Postgresql,Date,Format,Jquery Ui Datepicker,(我的问题与几乎相同,只是这个答案在我的情况下不起作用。) 我在一个带有Postgres db的Rails应用程序中使用。默认实现使用mm/dd/yy日期格式来显示所选日期,这正是我想要的。但是,在我将记录保存到数据库后,月份和日期会颠倒-然后显示为yy-dd-mm。因此,选择3/11/2012将尝试保存为11月3日,而不是3月11日,而像3/31/2012这样的日期根本不会保存,因为它不存在 到目前为止,我已经尝试了3种不同的方法来解决这个问题: 1) 第一次尝试是重新设置文本字段的格式,以

(我的问题与几乎相同,只是这个答案在我的情况下不起作用。)


我在一个带有Postgres db的Rails应用程序中使用。默认实现使用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" %>
这根本没有什么区别。接下来,我找到并尝试使用以下行创建config/initializers/date_formats.rb

Date::DATE_FORMATS[:default]="%m/%d/%Y"
Time::DATE_FORMATS[:default]="%m/%d/%Y %H:%M"
同上,没有区别

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

$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });
before_save    :format_date
attr_accessor  :unformatted_date

def format_date
  self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc)
end
f.text_field  :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker'
从日历中选择3月31日将填充2012-03-31字段,保存后仍显示为2012-03-31


但我究竟如何让日期选择器使用mm/dd/yy格式呢?我无法想象这是一件很难做到的事情,但我错过了什么?我是否需要对Postgres中日期的存储方式做些什么?(它们被指定为日期,而不是日期时间。)

这取决于您在数据库中存储数据的方式。 如果您碰巧使用原始sql查询,您可以在insert查询中使用
到日期('2012年3月31日,'DD Mon YYYY')

Postgres'截止日期

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

$.datepicker.formatDate('dd-M-yy', Yourdate);
我使用DD Mon YYYY是因为它看起来更清晰。您可以根据需要使用
mm/dd/yy
格式或其他格式。在这些情况下,请在postgre的“截止日期”功能中使用所需的格式

请注意,我还没有测试上述代码。如果有任何问题或遇到任何麻烦,请留下评论

编辑:


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

如果要全局更改数据库集群的默认日期格式,还可以在
postgresql.conf
中设置并重新加载:

datestyle = 'iso, mdy'
(无论如何,这应该是默认设置。)

请注意,这不会影响日期在应用程序中的显示方式。PostgreSQL如何解释不明确的输入和Postgres的一些输出选项


如果您在(显然)不同的连接中检查psql中的
datestyle
设置,这并不能证明任何事情。您的应用程序可能正在结合本地设置设置不同的
datestyle
。您必须检查实际连接中的设置(不是来自psql)

如果您的datestyle设置为“iso,mdy”,那么它应该按照您的要求工作:日期文本是在一个月前一天解释的。考虑这个演示(使用PostgreSQL 9.1):

postgresql.conf
中重新加载。然后启动应用程序并保存日期。每个命令都将被记录。不要忘记在之后重置和重新加载(否则日志文件可能会变得巨大):

然后检查你的数据库日志文件,看看你的应用程序到底向数据库发送了什么



您可能还对该命令感兴趣,该命令允许您以任意格式输入日期文字。但是你不应该需要它。

我遇到了与原始海报相同的问题。因为我必须相互比较日期/时间,所以我不想将DB字段更改为字符串,因为这将需要额外的代码和以后的转换

最后,我在模型中使用了before_save和attr_访问器,如下所示:

$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });
before_save    :format_date
attr_accessor  :unformatted_date

def format_date
  self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc)
end
f.text_field  :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker'
我的视图中的线条如下所示:

$( ".datepicker" ).datepicker({ dateFormat: 'yy-mm-dd' });
before_save    :format_date
attr_accessor  :unformatted_date

def format_date
  self.inquiry_date = Date.strptime(self.unformatted_date, "%m/%d/%Y").to_time(:utc)
end
f.text_field  :unformatted_date, :value => (@foo.inquiry_date.blank? ? '' : @foo.inquiry_date.strftime('%m/%d/%Y)), :id => 'datepicker'

我可能不明白你在说什么,但我试着写了一个before_save方法来重新安排插入数据库之前的日期。这听起来像是可行的,但出于某种原因,我在试图保存日期数超过12的任何日期时仍然会出错。我知道这一定是因为它试图切换日期和月份,但我不知道这是在哪里发生的。为了知道,问题到底在哪一边,我已经把我的字段改成了“文本”而不是“日期”。这并不理想,但它确实很简单地解决了问题。有时,无论是否理想,切换都是一个很好的解决方案。但是出于好奇,你可能想知道这个问题,可能会在以后。Rails 3.2.3、Postgresql和Ruby 1.9.3。我已经将datepicker格式设置为mm dd yy,它已经工作了一段时间,但我正在进行重构,我可以轻松保存一些日期,但有一个日期不再保存。所以我要重新格式化回yy-mm-dd,我会看看会发生什么。更新:我在日期选择器调用中尝试了yy-mm-dd格式,但仍然得到“日期不能为空”。我很困惑,但由于没有其他解决方案,我将运行迁移来更改日期的数据类型,也更改文本,就像您所做的那样。。。希望我或其他人能找到一个解决方案。我有过几乎完全相同的经历,得到了相同的结果。对我来说,Rails3.0的工作方式是Date::Date_格式[:default],然而,升级到Rails3.2之后,它就不再工作了。在我的例子中,我认为问题可以归结为这样:
“01/03/13”。to_date.to_-->“03/01/13”
,这似乎很愚蠢,我确实
展示了datestyle并获得ISO、MDY,因此它是l