15

(我的问题与此问题中描述的几乎相同,只是该答案在我的情况下不起作用。)


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

到目前为止,我已经尝试了 3 种不同的途径来解决这个问题:

1)第一次尝试是重新格式化文本字段,以便显示看起来像我想要的那样:

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

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

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

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

这根本没有任何区别。接下来我发现了这个问题并尝试使用这些行创建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 中的存储方式做些什么?(它们被指定为日期,而不是日期时间。)

4

3 回答 3

3

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

Postgres 的to_date 参考

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

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

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

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

编辑:

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

于 2012-04-05T21:37:42.183 回答
0

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

datestyle = 'iso, mdy'

(无论如何这应该是默认值。)

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


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

如果您的 datestyle 设置是'iso, mdy',那么它应该按照您的意愿工作:日期文字被解释为month-before-day。考虑这个演示(使用 PostgreSQL 9.1):

db=# 设置日期样式 = 'ISO, MDY ';
放
db=# 选择 '1.12.2012'::date;
    日期
------------
 2012-01-12
(1 行)

db=# set datestyle = 'ISO, DMY ';
放
db=# 选择 '1.12.2012'::date;
    日期
------------
 2012-12-01
(1 行)

强调我的。

要了解您的应用实际设置了哪些选项,您可以设置

log_statement = all

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

log_statement = none

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


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

于 2012-04-06T00:09:30.600 回答
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'
于 2012-06-01T15:27:08.623 回答