【问题标题】:Rails TimeWithZone doesn't matchRails TimeWithZone 不匹配
【发布时间】:2019-08-29 04:49:14
【问题描述】:

我一直很糟糕,有两次说它不相等

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

【问题讨论】:

  • 为什么需要一个时间段的结束?使用&lt;= 进行比较?如果是这样,你可以改用&lt; beginning_of_next_period
  • 这是租约的期限@fphilipe,因此存储实际上不在租约中的一天的开始日期似乎很奇怪。这意味着当我还想显示租赁日期时,我将不得不从中减去一秒。
  • 我强烈建议使用包容性开始和排斥性结束。这更容易。也许这会让你信服:qedcode.com/content/exclusive-end-dates.html

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


【解决方案1】:

当模型保存到数据库时,这些时间戳存储在 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

  • 存储第二天的开始

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

【讨论】:

  • 我明白了,那么当我比较将有 9 个数字的 Time.zone.now 与将有 6 个数字的数据库内容时呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多