2014-10-17 87 views
-1

下面的代碼掃描一個字符串像這樣的日期 - 2014年6月10日00:00時間格式化紅寶石

window1= line[13].scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) if line[13] 

我如何保存這爲時間類的對象?

+0

'line [13]'只包含日期字符串,還是從更大的字符串中提取日期? – Stefan 2014-10-17 15:03:20

回答

0

假設你的格式是日/月/年

require 'date' 
DateTime.strptime('06/10/2014 00:00', '%d/%m/%Y %H:%M') 
+0

你扭轉了你的小時和分鐘符號。 – mcfinnigan 2014-10-17 14:57:20

0

scan如果你不注意,可以讓你在腳下自己拍攝。這樣考慮:

str = 'foo 06/10/2014 00:00 bar' 

str.scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) # => ["06/10/2014 00:00"] 

scan在字符串中返回的所有匹配模式的陣列。如果字符串是一個有點不同,你可能會得到意想不到的事情:

str = 'foo 06/10/2014 00:00 bar 99/99/9999 99:99 baz' 
str.scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) # => ["06/10/2014 00:00", "99/99/9999 99:99"] 

相反,如果你知道,只有一個值,只需使用常規賽中得到一個值。

str[/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/] # => "06/10/2014 00:00" 

注意如何有一長串的重複\d(數字字符集),並且逃脫/分隔符(「\/」)。那些可以使用一些技巧,使圖案更具有可讀性減少:

%r#\d+/\d+/\d+ \d+:\d+# # => /\d+\/\d+\/\d+ \d+:\d+/ 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "06/10/2014 00:00" 

\d+是指一個或更多的數字,從而降低了重複\d,但並沒有幫助擺脫逃脫分隔符。然而,備用分隔符將有所幫助,這正是%r允許我們執行的操作。以下%r第一個字符定義分隔符這樣的模式可以去從

\/\d 

/\d 

這是一個小的事情,但它有助於可讀性。

使用\d+雖然可以開闢一個新的問題,不是兩個或四個以上,其中,數字可以被捕獲:

str = 'foo 1/22/55555 22:666666 bar' 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "1/22/55555 22:666666" 

正則表達式模式進行擴展,允許我們指定有多少個字符被允許:

str = 'foo 06/10/2014 00:00 bar' 
str[%r#\d+/\d+/\d+ \d+:\d+#] # => "06/10/2014 00:00" 
str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "06/10/2014 00:00" 

str = 'foo 1/22/55555 22:666666 bar' 
str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => nil 

繼續獲取時間值....

Time類可以分析捕獲的字符串,返回的時間實例:

str = 'foo 06/10/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "06/10/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => Time 
Time.parse(time_str) # => 2014-10-06 00:00:00 -0700 

你必須非常小心這一點,因爲其格式爲 「MM/DD/YYYY HH:MM」很容易與「dd/mm/yyyy hh:mm」混淆。第一個是美國標準,第二是圍繞世界大多數的標準,當有碰撞語​​言不喜歡:

str = 'foo 01/31/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "01/31/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => 
Time.parse(time_str) # => 
# ~> 'local': argument out of range (ArgumentError) 

對戰:

str = 'foo 31/01/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "31/01/2014 00:00" 

require 'time' 
Time.parse(time_str).class # => Time 
Time.parse(time_str) # => 2014-01-31 00:00:00 -0700 

所以,修復你必須知道你的字符串來自哪個區域/ LOCALE,否則你會得到隨機的例外和/或混亂的月/日值。

parse很方便,但這是一把雙刃劍,由於這個問題。你可以嘗試使用strptime具有特定格式字符串:

str = 'foo 01/31/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "01/31/2014 00:00" 

require 'time' 
Time.strptime(time_str, '%m/%d/%Y %H:%M') # => 2014-01-31 00:00:00 -0700 

str = 'foo 31/01/2014 00:00 bar' 
time_str = str[%r#\d{1,2}/\d{1,2}/\d{4} \d{1,2}:\d{2}#] # => "31/01/2014 00:00" 
Time.strptime(time_str, '%d/%m/%Y %H:%M') # => 2014-01-31 00:00:00 -0700 
Time.strptime(time_str, '%m/%d/%Y %H:%M') # => 
# ~> 'strptime': invalid strptime format - `%m/%d/%Y %H:%M' (ArgumentError) 

但同樣,除非你知道的格式是什麼,你仍然會碰到的問題。這是編程非常困難的事情之一,也是網站經常會詢問某人所在位置的原因。猜測只是行不通。