2017-06-04 101 views
0

在Ruby中实现此目的最简单的方法是什么?如何比较Ruby中的时间戳

我有两个字符串:

a = "08:02:04.982" 
b = "10:07:12.004" 

我需要每个字符串转换成日期对象,然后比较,以确保b大于(迟于)a。如:

if b > a 
    print "this is normal" 
else 
    print "this is not normal" 
end 

我试着使用:

Time.parse("08:02:04.982") 

但坚持要返回的日期。

所以,我想:

Time.parse("08:02:04.982", "%H:%M:%S.%3N") 

但抱怨未定义的方法 “的一年”。

+2

为什么你想比较它的时间表示?他们的字符串表示法返回相同的结果:'a < b #=> true'和'b < a #=> false' – spickermann

+1

您想'strptime',而不是'parse' – Stefan

+0

哇!Ruby字符串比较是将字符串值转换为时间类型并比较后面的情况?那很棒!谢谢! – user3202399

回答

-1

默想这样的:

require 'time' 

TIME_FORMAT = '%H:%M:%S.%n' 

a = "08:02:04.982" 
b = "10:07:12.004" 

a_time = Time.strptime(a, TIME_FORMAT) # => 2017-06-04 08:02:04 -0700 
b_time = Time.strptime(b, TIME_FORMAT) # => 2017-06-04 10:07:12 -0700 

a_time < b_time # => true 
a_time > b_time# => false 
a_time <=> b_time # => -1 

没有一个日期分量与时间值是有风险的。很难知道时间是否在同一天发生。如果没有看到该信息,时间将会提供当前的“今日”,但如果您不确定日期是否相同,它可能会成为一个错误。

当你发现,你可以比较两个同样格式的字符串,而不将它们转换为时间或日期时间对象:

a < b # => true 
a > b # => false 
a <=> b # => -1 

你必须要小心,因为如果你收到没那个时间字符串一个在任何列前导零那么你的比较是错误的,而与解析到它会正确测试对象:

"8:2:4.982" == "08:02:04.982" # => false 
Time.strptime("8:2:4.982", TIME_FORMAT) # => 2017-06-04 08:02:04 -0700 
Time.strptime("08:02:04.982", TIME_FORMAT) # => 2017-06-04 08:02:04 -0700 

(是的,这是非常可能的,你可以得到的日期和时间,没有前导零在互联网的狂野之中,各种各样的疯狂hings发生)


我试着使用:

Time.parse("08:02:04.982") 

但坚持要返回的日期。

嗯... NO:

Time.parse("08:02:04.982").class # => Time 
Time.parse("08:02:04.982") # => 2017-06-04 08:02:04 -0700 

不要依赖parse除非你知道传入的日期/日期时间字符串的语言环境。你可以研究为什么。相反,如果字符串以一致的形式定义自己的格式字符串。它会更快,更可靠。