Rails TimeWithZone 不匹配

Rails TimeWithZone doesn't match

我经历了一段糟糕的时光,有 2 次说它不相等

# 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)。除非有更好的方法来处理这个问题,因为我的时间涉及 'end of the month'(某学期末)

将模型保存到数据库时,这些时间戳存储在 timestamp without time zone 类型 has microsecond resolution 中。当您的时间精度达到纳秒级时,它会被截断。

要修复它,您可以尝试:

  • round 的日期近似为整微秒:
1.day.ago.round(6).nsec
#=> 158812000
1.day.ago.round(6)
#=> Wed, 28 Aug 2019 03:21:51 EDT -04:00

  • 存储第二天的开始

我知道这些都不是完美的解决方案,现在想不出更好的解决方案。