时间格式化红宝石

时间:2014-10-17 14:48:48

标签: ruby

以下代码会扫描字符串中的日期 - 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]  

如何将其保存为时间类的对象?

3 个答案:

答案 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)

如果你不注意的话,{p> 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)

但是,除非你知道格式是什么,否则你仍然会遇到问题。这是关于编程的一个非常难的事情,也就是为什么网站常常会询问某人所在的位置。猜猜还不好。