在红宝石中识别时间串

时间:2011-03-02 18:29:34

标签: ruby parsing time

这不是什么大问题,真的,这完全是出于好奇。

对于我正在处理的程序,我在特定时间(当前每天一次,可能会更改)向文件写入信息,但这样做的方式是每条记录的信息的时间都很重要。因此,每次我想采样并将信息附加到文件时,首先我附加以下内容:

file_out.write Time.now

作为一种简单的方法来记住每次写入的确切时间。

现在我对此感到好奇:有没有办法检查从文件中收到的字符串(例如“cur_line = file_in.gets”)是否为时间戳?

这不是问题的原因是我当前的方法是简单的正则表达式:

if cur_line =~(/^(Mon|Tue|Wed|Thu|Fri|Sat|Sun) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)/)

似乎完全符合我的需求。 (由于项目的性质以及我编写的格式,我知道文件中没有其他行包含任何格式为'{Day} {Month}'的文本,所以我不再在那里解析。只是一天或一个月都不够,导致误报。)

还有其他可能更漂亮的方法来检查时间戳吗?我不一定会使用别的东西(特别是如果你说“你可以做X但会导致性能受到很大影响”)(在这个项目中,并不是比较是对性能的一个重要关注。我猜这个区别可能可以忽略不计))。

这让我觉得很有趣,而且我猜想在Ruby中可能有很酷的做法。 :)

2 个答案:

答案 0 :(得分:2)

您可以执行Time.parse cur_line,如果无法正确解析时间,则会返回当前日期。不一定理想,但Time.parse非常强大:)

编辑:有趣的方式来做你的正则表达式: 在循环遍历文件之前,请将正则表达式声明为:

expression = Regexp.new("^(#{Time::RFC2822_DAY_NAME.join("|")}) (#{Time::RFC2822_MONTH_NAME.join("|")})")

然后,当您遍历每一行时,请执行:cur_line.match(expression)。如果不匹配,这将返回nil。这是一种有趣的(虽然更长)方式。

答案 1 :(得分:1)

您可以尝试通过chronicDate.parse运行这些行,但我敢打赌,这两种方法的效率都低于使用正则表达式。效率的影响完全取决于您需要解析的文本量。