Rails TimeWithZone不匹配

时间:2019-08-29 04:49:14

标签: ruby-on-rails ruby activesupport ruby-on-rails-6

我一直在经历两次糟糕的时光,说那不相等

# 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)。除非当我的时间涉及“月末”(某个学期的结束)时,否则没有更好的方法来解决这个问题

1 个答案:

答案 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

  • 存储第二天的开始时间

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