为什么这两个日期时间不同?

Jer*_* F. 14 ruby datetime parsing ruby-on-rails

为什么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 ?!
Run Code Online (Sandbox Code Playgroud)

我实际上在Ruby on Rails应用程序中遇到了麻烦,我尝试根据已解析的日期时间属性查找记录,如最后一行所示.

我真的不明白.时区是相同的,时间是相同的秒到秒.这里发生了什么事?

此外,我应该如何根据解析的日期时间查找记录?

dim*_*ura 21

它们不应该是一样的:

current.to_f #=> 1442417032.6567826
parsed.to_f  #=> 1442417032.0
Run Code Online (Sandbox Code Playgroud)

解析时,您会错过毫秒.

  • 我想知道你以后是否拿到了这个条目,它会包括那些毫秒吗?@JeremyF.你的数据库技术是什么?MySQL肯定不会存储毫秒,而PostgreSQL会存储毫秒. (3认同)
  • @JeremyF. - 在绝大多数情况下,如果在从数据库中检索日期/时间时必须解析字符串,那么你做错了.您应该关注数据类型映射,而不是字符串解析. (3认同)

Jer*_* F. 5

谢谢大家的帮助.我希望你不介意,但由于最终答案的部分分散在多个答案中,我将根据你们所说的话回答我自己的问题.

因此,为什么日期不同,这是因为解析的日期时间中缺少毫秒.正如@dimakura所说.

current.to_f #=> 1442417032.6567826
parsed.to_f  #=> 1442417032.0
Run Code Online (Sandbox Code Playgroud)

然后回答关于我们如何根据解析的日期时间获取Ticket记录.

首先,重要的是要知道这只与PostgreSQL(我的情况)或实际存储毫秒的其他数据库相关.感谢@sjagr提到这一点.

所以我们必须查询从解析到解析+ 1秒的范围,就像@Stefan解释的那样:

Ticket.where(datetime: parsed...parsed+1).first
Run Code Online (Sandbox Code Playgroud)

如果我们控制了Ticket创建,我们还可以在保存数据库之前删除毫秒精度.感谢@sjagr提供了一种简单的方法.

current = Time.current
Ticket.create(datetime: current.change(usec: 0))
Run Code Online (Sandbox Code Playgroud)

感谢大家 !