我一直在经历两次糟糕的时光,说那不相等
# returns TRUE before persisted, but when retrieved from postgres it's FALSE
end_date == end_date.in_time_zone('Eastern Time (US & Canada)').end_of_day
您的直觉可能是usec
,但是我已经检查了很多次,而两者都是999999
:
[21] pry(#<Lease>)> end_date.usec
=> 999999
[22] pry(#<Lease>)> end_date.in_time_zone('Eastern Time (US & Canada)').end_of_day.usec
=> 999999
[23] pry(#<Lease>)> end_date.to_i
=> 1580533199
[24] pry(#<Lease>)> end_date.in_time_zone('Eastern Time (US & Canada)').end_of_day.to_i
=> 1580533199
[25] pry(#<Lease>)> end_date.class
=> ActiveSupport::TimeWithZone
[26] pry(#<Lease>)> end_date.in_time_zone('Eastern Time (US & Canada)').end_of_day.class
=> ActiveSupport::TimeWithZone
[33] pry(#<Lease>)> end_date.iso8601
=> "2020-02-01T04:59:59Z"
[34] pry(#<Lease>)> end_date.in_time_zone('Eastern Time (US & Canada)').end_of_day.utc.iso8601
=> "2020-02-01T04:59:59Z"
这让我发疯,我不知道还要检查什么...
编辑:看来nsec
有所不同。我该怎么解释呢?我如何将纳秒截断到一定的精度(6)。除非当我的时间涉及“月末”(某个学期的结束)时,否则没有更好的方法来解决这个问题
答案 0 :(得分:1)
将模型保存到数据库时,这些时间戳以has microsecond resolution的类型timestamp without time zone
存储。当您的时间达到纳秒级时,它将被截断。
要解决此问题,您可以尝试:
round
的日期近似为整微秒:1.day.ago.round(6).nsec
#=> 158812000
1.day.ago.round(6)
#=> Wed, 28 Aug 2019 03:21:51 EDT -04:00
我知道这些不是完美的解决方案,现在想不出更好的解决方案。