Как сравнить время в рубине - PullRequest
8 голосов
/ 06 января 2012

Мне нужно использовать объект Time как int (TimeObject.to_i) Затем мне нужно преобразовать int обратно во время, чтобы сравнить с исходным временем. Краткий пример

t1 = Time.now
t2 = Time.at(t1.to_i)
puts t1 == t2    # Says False
puts t1.eql?(t2) # Says False

Почему это говорит о ложности? Когда я печатаю оба Time Objetcs показывает одно и то же D:

puts t1                 #shows : 2012-01-06 16:01:53 -0300
puts t2                 #shows : 2012-01-06 16:01:53 -0300
puts t1.to_a.to_s       #shows : [ 53, 1, 16, 6, 1, 2012, 5, 6, true, "CLST"]      
puts t2.to_a.to_s       #shows : [ 53, 1, 16, 6, 1, 2012, 5, 6, true, "CLST"]      

это одно и то же D: но при попытке сравнить с == или eql? говорит, что они разные (извините за мой плохой английский)

1 Ответ

13 голосов
/ 06 января 2012

Ответ

t1 = Time.now
t2 = Time.at(t1.to_i)
t3 = Time.at(t1.to_i)
puts t1  # 2012-01-06 23:09:41 +0400
puts t2  # 2012-01-06 23:09:41 +0400
puts t3  # 2012-01-06 23:09:41 +0400

puts t1 == t2      # false
puts t1.equal?(t2) # false
puts t1.eql?(t2)   # false

puts t2.equal? t3  # false
puts t2.eql? t3    # true
puts t2 == t3      # true

Объяснение:

EQL? (Other_time)

Вернуть true, если time и other_time являются одновременно объектами Time с одинаковыми секундами и долями секунды.

Ссылка: Время # eql?

Таким образом, по-видимому, доли секунды отбрасываются при выполнении #to_i, а затем восстановленное время не совсем совпадает с исходным. Но если мы восстановим две копии, они будут равны.

Можно подумать: «Эй, тогда давайте использовать #to_f!». Но, что удивительно, результаты такие же! Может быть, это из-за ошибок округления или сравнения с плавающей точкой, не уверен.

Альтернативный ответ

Не преобразовывать целое число обратно во время для сравнения. Вместо этого преобразуйте исходное время в int!

t1 = Time.now
t2 = Time.at(t1.to_i)

puts t1  # 2012-01-06 23:44:06 +0400
puts t2  # 2012-01-06 23:44:06 +0400

t1int, t2int = t1.to_i, t2.to_i

puts t1int == t2int           # true
puts t1int.equal?(t2int.to_i) # true
puts t1int.eql?(t2int)        # true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...