2012-04-05 98 views
14

扭转了(我的问题是几乎一样described in this question,只是这个问题的答案并不在我的情况下工作。)Rails3中/ jQuery UI的日期选择器 - 月和日是保存


我使用jQuery UI Datepicker在一个Rails应用程序与Postgres数据库。默认实现使用日期格式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" %> 

这显示03/31/2012最初正确,但保存时仍然颠倒。

2)所以接下来我尝试改变日期存储的默认方式,认为这将解决问题。正如在回答描述this question,我增加了以下内容配置/区域设置/ en.yml

# config/locales/en.yml 
en: 
    date: 
    formats: 
     default: "%m/%d/%Y" 

这并没有任何区别的。接下来,我发现this question,并试图建立配置/初始化/ 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({ dateFormat: 'yy-mm-dd' }); 

选择从日历3月31日填充字段2012-03-31,仍然显示为2012-03-31保存后。

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

+0

要停止通过这种扑我的头靠在墙上,我刚刚将我的字段切换为“文本”而不​​是“日期”。这并不理想,但它确实很简单地解决了问题。 – ellawren 2012-04-06 14:32:04

+0

某些时候切换是一个很好的解决方案,不管它是否理想。但仍然为了好奇你可能想知道这个问题,可能会晚一些。 – 2012-04-06 18:20:25

+0

Rails 3.2.3,Postgresql和Ruby 1.9.3。我将datepicker格式设置为mm-dd-yy并且它工作了一段时间,但我正在经历一次重构,我可以保存一些日期而没有麻烦,但是特别不再保存一个日期。所以我要重新格式化为yy-mm-dd,我会看到会发生什么。 – thomasvermaak 2012-04-09 18:07:42

回答

3

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

Postgres的现在to_datereference

,在您的客户端,在jQuery的日期选取器可以使用

$.datepicker.formatDate('dd-M-yy', Yourdate); 

我用DD周一YYYY因为它看起来更清晰。您可以根据需要使用mm/dd/yy格式或其他格式。在这种情况下,需要使用格式在postgre的to_date功能

请注意,我还没有上面的代码进行测试。如果有任何问题或发生任何问题,请发表评论。

编辑:

您可以使用您的轨道Date.parse('2011-06-18')查看,插入数据到数据库之前,并在日期选择器设置formatDate'yy-mm-dd'

+0

我可能不理解你在说什么,但我试着编写一个before_save方法来在数据插入数据库之前重新排列日期。这听起来像它会工作,但由于某种原因,我仍然有错误时,试图保存任何日期的数字超过12日。我知道这一定是因为它试图切换日期和月份,但我不能找出发生的地方。 – ellawren 2012-04-06 14:29:58

+0

请参阅记录rails生成的查询(以及日期列的值)。以便知道,在什么方面问题实际上是 – 2012-04-06 17:26:19

0

如果要全局更改默认的日期格式为你的数据库集群,你也可以设置你的postgresql.confDateStyleGUC和重装:

datestyle = 'iso, mdy' 

(这应该是默认反正。)

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


如果您在PSQL的datestyle设定在(明显)不同的连接,那不证明什么。您的应用可能会设置与本地设置不同的datestyle。你将不得不检查实际连接中的设置(而不是来自psql)。

如果您DATESTYLE设置'iso, mdy',那么它应该工作,你希望它:日期文字解释个月-前一天。考虑这个演示(使用PostgreSQL 9.1):

 
db=# set datestyle = 'ISO, MDY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-01-12 
(1 row) 

db=# set datestyle = 'ISO, DMY'; 
SET 
db=# select '1.12.2012'::date; 
    date 
------------ 
2012-12-01 
(1 row) 

强调我的。

为了找到答案,哪些选项实际上是由您的应用程序设置,您可以在postgresql.conf设置

log_statement = all 

并重新加载。然后启动您的应用程序并保存日期。每一个命令都会被记录下来。不要忘了复位,之后重新加载(或您的日志文件可能会增长很大):

log_statement = none 

然后检查你的数据库的日志文件你的应用程序实际发送到数据库。


您还可能有兴趣在to_date()命令,可以让你在任何你喜欢的格式输入日期文字。但你不应该需要这个。

+0

我做'show datestyle;'在psql中获得了ISO,MDY,所以它看起来已经是正确的了。 – ellawren 2012-04-06 14:40:31

+0

在另一个连接中检查'psql'几乎不能证明任何事情。我添加了一些更多的信息给我的答案。 – 2012-04-09 17:47:49

0

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

我结束了使用before_save和attr_accessor在我的模型是这样的:

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'