2011-06-07 36 views
1

在試圖解析一個日期,我一直在貨架我的大腦小時:我剛找到軌道日期格式的錯誤?

Date.today.to_s 
=> "06/07/2011" 

Date.today 
=> Tue, 07 Jun 2011 

Date.parse Date.today.to_s 
=> Wed, 06 Jul 2011 

Date::DATE_FORMATS[:default] 
=> "%m/%d/%Y" 

的to_s的默認格式是比解析默認格式不同?他們爲什麼要這樣對我?

使用Rails 3.0.5與1.9.2的Ruby-P180

UPDATE 所以感謝您的回答,我意識到DATE_FORMATS是鐵軌的事情,而Date.format使用Ruby庫(正確?)。有沒有辦法用默認的DATE_FORMAT解析日期/時間而不使用strptime?

+0

在Rails 3.1rc1中不會發生在我身上。 – Veeti 2011-06-07 19:49:58

+0

@Veeti - 如果你做了'Date :: DATE_FORMATS [:default] =「%m /%d /%Y'''然後運行代碼,你會看到它。他可能有一個初始化程序設置這個默認的日期格式。 – 2011-06-07 19:58:16

回答

5

通常情況下,Date.today.to_s將返回「2011-06-07」,但由於您設置了默認日期格式,所以使用「06/07/2011」代替。

Date.parse輕鬆識別YYYY-MM-DD格式,但是當它看到06/07/2011時,它認爲這確實是DD/MM/YYYY(而不是MM/DD/YYYY) - 請記住Date.parse對你設置的Rails默認日期格式一無所知。默認的日期格式僅適用於Rails的輸出Date.to_s)。

你可以迫使它解析MM/DD/YYYY日期是這樣的:

Date.strptime(Date.today.to_s, "%m/%d/%Y") 
# => Tue, 07 Jun 2011 
+0

但是不應該Time.zone.parse至少使用這個信息?默認日期格式僅用於輸出而不用於解析? – hb922 2011-06-07 23:39:29

0

我想,to_s方法使用locale option來確定如何寫日期。

雖然我看不到這是一個問題。 Date.parse使用啓發式來解析日期,所以有時會出錯。

0

的慢性寶石(link)解決了幾乎所有的日期解析的問題(是的,他們是非常煩人) 。

Chronic.parse("06/07/2011") 
#=> 2011-06-07 12:00:00 +0000