下面的代碼掃描一個字符串像這樣的日期 - 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]
我如何保存這爲時間類的對象?
下面的代碼掃描一個字符串像這樣的日期 - 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]
我如何保存這爲時間類的對象?
假設你的格式是日/月/年
require 'date'
DateTime.strptime('06/10/2014 00:00', '%d/%m/%Y %H:%M')
你扭轉了你的小時和分鐘符號。 – mcfinnigan 2014-10-17 14:57:20
window1 = DateTime.strptime(line[13], '%d/%m/%Y %H:%M') if line[13]
將是一個良好的開端。
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/date/rdoc/DateTime.html是一個很好的參考。事實上,一般來說ruby-doc.org可能是花點時間的好地方。
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)
但同樣,除非你知道的格式是什麼,你仍然會碰到的問題。這是編程非常困難的事情之一,也是網站經常會詢問某人所在位置的原因。猜測只是行不通。
'line [13]'只包含日期字符串,還是從更大的字符串中提取日期? – Stefan 2014-10-17 15:03:20