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)
解析时,您会错过毫秒.
谢谢大家的帮助.我希望你不介意,但由于最终答案的部分分散在多个答案中,我将根据你们所说的话回答我自己的问题.
因此,为什么日期不同,这是因为解析的日期时间中缺少毫秒.正如@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)
感谢大家 !
| 归档时间: |
|
| 查看次数: |
690 次 |
| 最近记录: |