我有以下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
的值。如果我只使用>
,我会收到转化错误。
有什么想法吗?
答案 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
和格式字符串的更多信息。