2012-04-05 56 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' 
相關問題