gpt4 book ai didi

ruby-on-rails - 如何将 Rails DateTime 分辨率限制为微秒?

转载 作者:行者123 更新时间:2023-12-03 19:30:07 25 4
gpt4 key购买 nike

rails 支架 DateTime分辨率为纳秒,但我注意到这取决于运行应用程序的机器。

在运行 Mojave 的 MacBook 上,Time.zone.now.strftime("%N")将始终输出以 000 结尾的 9 位数字, (例如 "122981000" )。这意味着在 Mac 上,分辨率仅限于微秒级。

然而,在 Linux 上,相同的命令返回一个具有完整纳秒分辨率的数字(例如 "113578523" )。

我在使用 rspec 时出现问题我需要比较一些 DateTime值。
当我在我的 Mac 上开发时,测试完美通过,但是当我们的 CI (Travis) 运行相同的测试时,它会像这样失败:

       expected: 2019-04-09 19:14:27.214939637 -0300
got: 2019-04-09 19:14:27.214939000 -0300

这里的问题是我们的数据库 Postgres 仅限于微秒,就像我的 Mac 一样,它不会失败。我存储了 DateTime在数据库中,然后读回它并与我在内存中的内容进行比较。 DB 舍入到微秒,因此比较失败。

是否可以强制 Rails 使用微秒精度运行?
我的目的是不需要在每次测试中手动舍入或截断时间戳。

最佳答案

我以前遇到过这个问题,新创建的 ActiveRecord 对象在内存中创建/更新的字段上的精度为 9 位(在 Travis linux VM 上),这与 Postgres 中存储的不同(6 位) )。我遇到了同样的问题,这些测试在本地(macOS)通过但在 CI 构建中失败。
过去,我曾修改规范以强制重新加载对象,该方法有效,但正如您所强调的那样很难看,因为您必须为每次测试都这样做。最近我又遇到了同样的问题,但这次我创建的服务对象无法“重新加载”,所以我开始尝试寻找更好的解决方案。
它并不完全理想,因为它需要猴子修补 Time 类,但是,它有效!

module ForceTimePrecision
def now
super.round(6)
end
end

Time.singleton_class.send(:prepend, ForceTimePrecision)
修补 Time 单例的机制(因为我不能直接覆盖 Time.now)基于此答案 https://stackoverflow.com/a/60665577/989981

关于ruby-on-rails - 如何将 Rails DateTime 分辨率限制为微秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55632622/

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