gpt4 book ai didi

ruby-on-rails - Ruby Time.zone.now 和数据库精度计算

转载 作者:数据小太阳 更新时间:2023-10-29 08:42:31 27 4
gpt4 key购买 nike

我在 Rails 3 测试套件中进行了一项测试,该测试套件进行了一些断言,这些断言比较了在我的本地机器上通过但在我们的 CI 管道中失败的时间戳。此测试将时间戳存储在 Postgres 数据库时间戳字段中,精度为 6,并将存储的值与原始时间戳进行比较,与以下示例非常相似:

tmp_time = Time.zone.now
u = User.find(1)
u.updated_at = tmp_time
u.save!
u.reload

assert_equal u.updated_at.to_i, tmp_time.to_i # passes...
assert_equal u.updated_at, tmp_time # fails...
assert_equal u.updated_at.to_f, tmp_time.to_f # fails...

我认为这个问题与 Ruby 的时间表示比存储值的精度更高有关。

除了在比较中不太精确之外,补偿由于精度导致的值的微小差异的最佳方法是什么?我们考虑过覆盖 Time.zone.now,但相信这会导致下游问题。

提前致谢。

最佳答案

问题可能不在于数据库的精度,而是在您定义 tmp_time 和保存之间经过了一小段时间。

您可以看到 Time 的 .to_f 表示立即发生变化:

irb(main):011:0> 2.times.map { Time.now.to_f }
=> [1551755487.5737898, 1551755487.573792]

当您使用 .to_i 时通常看不到这种差异,因为它四舍五入到最接近的秒数。

您可以使用 Timecop ,正如另一个答案提到的那样,要解决这个问题:

irb(main):013:0> Timecop.freeze { 2.times.map { Time.now.to_f } }
=> [1551755580.12368, 1551755580.12368]

关于ruby-on-rails - Ruby Time.zone.now 和数据库精度计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54994592/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com