如何比较Ruby中的时间戳

时间:2017-06-04 11:16:51

标签: ruby

在Ruby中实现这一目标的最简单方法是什么?

我有两个字符串:

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

我需要将每个字符串转换为日期对象,然后进行比较以确保ba更大(稍后)。如:

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")

但抱怨未定义的方法"年"。

1 个答案:

答案 0 :(得分:-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

没有日期组件比较时间值是有风险的。很难知道时间是否在同一天发生。时间将提供当前&#34;今天&#34;如果它没有看到这些信息,但如果您不确定日期是否相同,则可能是一个错误。

如您所见,您可以比较两个格式相同的字符串,而无需将它们转换为Time或DateTime对象:

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

(而且,是的,很有可能你可以获得没有领先零的日期和时间。在互联网的荒野中,各种各样的疯狂事情都会发生。)

  

我尝试使用:

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

但是坚持要求约会。

嗯......不:

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

除非您知道传入日期/日期时间字符串的LOCALE,否则不要依赖parse。你可以研究一下原因。相反,如果字符串采用一致的形式,则定义自己的格式字符串。它会更快,更可靠。