以下代码会扫描字符串中的日期 - 06/10/2014 00:00
window1= line[13].scan(/\d\d\/\d\d\/\d\d\d\d\s\d\d\:\d\d/) if line[13]
如何将其保存为时间类的对象?
答案 0 :(得分:2)
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一般来说可能是一个花点时间的好地方。
答案 1 :(得分:0)
假设您的格式为日/月/年
require 'date'
DateTime.strptime('06/10/2014 00:00', '%d/%m/%Y %H:%M')
答案 2 :(得分: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类可以解析捕获的字符串并返回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)
但是,除非你知道格式是什么,否则你仍然会遇到问题。这是关于编程的一个非常难的事情,也就是为什么网站常常会询问某人所在的位置。猜猜还不好。