Почему эти два дня отличаются?

Почему не Time.current равно его анализируемому эквиваленту?

current = Time.current
# Wed, 16 Sep 2015 17:10:56 CEST +02:00
parsed = Time.zone.parse('16 Sep 2015 17:10:56')
# Wed, 16 Sep 2015 17:10:56 CEST +02:00
current == parsed
# false <= What ?!
current.to_i == parsed.to_i
# true
Ticket.create(datetime: current)
# ...
Ticket.find_by_datetime(parsed)
# nil  <= Why ?!

У меня есть проблемы с этим в приложении Ruby on Rails, где я пытаюсь найти запись на основе атрибута datetime, который был проанализирован, как показано на последних строках.

Я действительно не понимаю. Часовой пояс один и тот же, времена одни и те же вплоть до секунд. Что здесь происходит?

Кроме того, как мне перейти к поиску записи на основе анализируемого datetime?

Ответы

Ответ 1

Спасибо всем за помощь. Надеюсь, вы не возражаете, но, поскольку фрагменты окончательного ответа разбросаны по нескольким ответам, я отвечу на мой вопрос, основываясь на том, что вы все сказали.

Итак, почему даты отличаются, это связано с отсутствием миллисекунд в анализируемом дате. Как отметил @dimakura.

current.to_f #=> 1442417032.6567826
parsed.to_f  #=> 1442417032.0

Затем ответ о том, как мы могли бы получить запись Билета на основе проанализированного времени datetime.

Прежде всего важно знать, что это будет актуально только для PostgreSQL (мой случай) или других баз данных, которые фактически хранят миллисекунды. Спасибо @sjagr за это.

Итак, мы должны запросить диапазон от разбора до разобранного + 1 секунду, как объяснил @Stefan:

Ticket.where(datetime: parsed...parsed+1).first

И если у нас есть контроль над созданием билета, мы можем также удалить миллисекундную точность перед сохранением базы данных. Благодаря @sjagr для обеспечения простого способа сделать это.

current = Time.current
Ticket.create(datetime: current.change(usec: 0))

Спасибо всем!

Ответ 2

Они не должны быть одинаковыми:

current.to_f #=> 1442417032.6567826
parsed.to_f  #=> 1442417032.0

При разборе вы пропустите миллисекунды.

Ответ 3

Это потому, что они не равны, они различаются по частям второго. То, что вы видите на консоли, является результатом метода inspect, называемого этими датами, который по умолчанию отбрасывает любые подсевые части.