如何比较Ruby中的时间?

时间:2014-07-07 22:25:44

标签: ruby

我有以下ruby代码:

session.each do |loads|
    time= session.GetTime
    puts time
end

此代码返回多个值:

2014-05-04T10:11:24.509-04:00

2014-03-04T11:01:39.242-04:00

2014-06-22T19:47:58.477-04:00

2014-02-21T23:56:25.869-04:00

我想比较时间并仅返回大于2014-06-01的值。如果我只使用>,我会收到转化错误。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

Time.parse()个对象上使用time,它应该将它们转换为更友好的Ruby对象,并允许您使用><=等进行比较。< / p>

答案 1 :(得分:0)

my_time = Time.new(2014, 06, 01)

然后尝试

time >= my_time

答案 2 :(得分:0)

Time.strptime是解析时间值的主力方法:

require 'time'

TIME_SPLIT = Time.parse('2014-06-01')

times = %w[
  2014-05-04T10:11:24.509-04:00
  2014-03-04T11:01:39.242-04:00
  2014-06-22T19:47:58.477-04:00
  2014-02-21T23:56:25.869-04:00
].select{ |t| Time.strptime(t, '%FT%T.%L%z') > TIME_SPLIT }
# => ["2014-06-22T19:47:58.477-04:00"]

Time.parse也很有用,但它可能被看起来像MM / DD / YYYY形式的值所欺骗,但实际上是DD / MM / YYYY,其中日期大于12.日期在美国通常是MM / DD / YYYY,所以人们会在类似于&#39; 12/31 / 2000&#39;失败:

Time.parse('12/31/2000')
ArgumentError: argument out of range

问题是,没有一个月&#34; 31&#34;,它是一天。

Time.parse('31/12/2000')
# => 2000-12-31 00:00:00 -0700

同样,某些日期可能会模糊不清,因此会被错误地解析。如果此日期来自美国客户,那么该月将被假定为第一个月,但是从另一个地区开始,它将成为日期:

Time.parse('01/02/2000') # => 2000-02-01 00:00:00 -0700

但是,再一次,解析认为这是一天,所以要小心。

不要让parse尝试并可能错误或失败,最好定义代码可以理解的格式,查看数据来自的区域,然后应用适当的格式。这是两种不同的说法:

Time.strptime('2014-05-04T10:11:24.509-04:00', '%FT%T.%L%z') # => 2014-05-04 07:11:24 -0700
Time.strptime('2014-03-04T11:01:39.242-04:00', '%Y-%m-%dT%H:%M:%S.%L%z') # => 2014-03-04 08:01:39 -0700

如何定义月份是第一还是第二:

Time.strptime('01/02/2001', '%m/%d/%Y') # => 2001-01-02 00:00:00 -0700
Time.strptime('01/02/2001', '%d/%m/%Y') # => 2001-02-01 00:00:00 -0700

您可以在the documentation中找到有关strptime和格式字符串的更多信息。