2012-02-28 63 views
3

之間解析使用Ruby 1.8.7:的差異日期字符串的Ruby 1.9.3和Ruby 1.8.7

>> require 'time' 
>> Time.parse '01/28/2012' 
=> Sat Jan 28 00:00:00 +0200 2012 
>> Time.parse '28/01/2012' 
=> ArgumentError: argument out of range 

使用Ruby 1.9.3:

>> require 'time' 
>> Time.parse '28/01/2012' 
=> 2012-01-28 00:00:00 +0200 
>> Time.parse '01/28/2012' 
=> ArgumentError: argument out of range 

它看起來像Ruby的1.8 .7它接受美國格式(月/日/年),而在Ruby 1.9.3中它只接受非美國格式(日/月/年)。

有沒有辦法改變這種行爲像Ruby 1.8.7?

回答

7

您可以選擇使用Time.strptime("01/28/2012", "%m/%d/%Y")代替Time.parse嗎?這樣你就可以更好地控制Ruby如何解析日期。

如果沒有寶石(例如ruby-american_date),使Ruby 1.9 Time.parse的行爲與Ruby 1.8.7類似,但只有在絕對必要時才使用它。

1.9.3-p0 :002 > Time.parse '01/28/2012' 
ArgumentError: argument out of range 

1.9.3-p0 :003 > require 'american_date' 
1.9.3-p0 :004 > Time.parse '01/28/2012' 
=> 2012-01-28 00:00:00 +0000 
+0

Ruby只能猜測日期格式如此之好,而美式格式由於含糊不清而令人生氣。 '01/02/03'是......究竟是什麼? 'YY/MM/DD'? 'DD/MM/YY'? 'MM/DD/YY'? – tadman 2012-02-28 15:19:45

+0

因爲有問題的代碼是使用Rails的'String#to_time',它使用'Time.parse'我正在尋找一個解決方案來改變'Time.parse'的工作方式。如果它不是現有的代碼,我肯定會使用'Time.strptime' - 更強大。感謝您指出ruby-american_date寶石! – arikfr 2012-02-28 15:34:53

0

的Ruby 1.9.3似乎已經更改了默認的日期解析格式...

在Ruby 1.8.7

"11/14/2012".to_time 
==> Wed Nov 14 00:00:00 UTC 2012 

在Ruby 1.9.3

"11/14/2012".to_time 
ArgumentError: invalid date 

to_time轉換現在接受%d,%m,%Y作爲字符串格式...

在Ruby 1.9.3

"14/11/2012".to_time 
2012-11-14 00:00:00 UTC 

通知的輸出的不同的格式。 Time.now.to_s在1.9.3中也返回不同的格式。小心!

我看到另一篇文章,稱to_time在Ruby 1.9.3中被故意棄用,但似乎只有解析格式發生了變化。

而且......

在1.8.7

Time.parse("11/14/2012", "%m,%d,%Y") 
==> Wed Nov 14 06:00:00 UTC 2012 

在1.9.3

Time.parse("11/13/2012", "%m,%d,%Y") 
==> ArgumentError: argument out of range 

Time.strptime不存在1.8.7,只在1.9.3 ,所以我沒有看到在1.9.3進行必要的修改後,我的代碼向後兼容1.8.7的方法。

+0

** Ruby!= Rails ** – Nakilon 2014-11-06 18:40:43