gpt4 book ai didi

ruby-on-rails - rails/ ruby : TimeWithZone comparison inexplicably failing for equivalent values

转载 作者:数据小太阳 更新时间:2023-10-29 06:47:05 26 4
gpt4 key购买 nike

我在当前项目中比较 DateTime 时遇到了一段糟糕的时光(没有双关语意),特别是比较 ActiveSupport::TimeWithZone 的两个实例。问题是我的两个 TimeWithZone 实例具有相同的值,但所有比较都表明它们不同。

执行调试时暂停(使用RubyMine),可以看到如下信息:

timestamp = {ActiveSupport::TimeWithZone} 2014-08-01 10:33:36 UTC
started_at = {ActiveSupport::TimeWithZone} 2014-08-01 10:33:36 UTC

timestamp.inspect = "Fri, 01 Aug 2014 10:33:36 UTC +00:00"
started_at.inspect = "Fri, 01 Aug 2014 10:33:36 UTC +00:00"

然而比较表明值不相等:

timestamp <=> started_at = -1

我在搜索中找到的最接近的答案 ( Comparison between two ActiveSupport::TimeWithZone objects fails ) 在这里指出了同样的问题,我尝试了适用的解决方案但没有成功(尝试了 db:test:prepare 但我没有运行 Spring)。

此外,即使我尝试转换为显式类型,在比较时它们仍然不等价。

到_时间:

timestamp.to_time = {Time} 2014-08-01 03:33:36 -0700
started_at.to_time = {Time} 2014-08-01 03:33:36 -0700

timestamp.to_time <=> started_at.to_time = -1

截止日期:

timestamp.to_datetime = {Time} 2014-08-01 03:33:36 -0700
started_at.to_datetime = {Time} 2014-08-01 03:33:36 -0700

timestamp.to_datetime <=> started_at.to_datetime = -1

到目前为止,我发现的唯一“解决方案”是使用to_i 转换两个值,然后进行比较,但这对于我想在任何地方编写代码都非常尴尬比较(而且,似乎应该是不必要的):

timestamp.to_i = 1406889216
started_at.to_i = 1406889216

timestamp.to_i <=> started_at.to_i = 0

如有任何建议,我们将不胜感激!

最佳答案

已解决

正如上面 Jon Skeet 所指出的,由于时间上隐藏的毫秒差异,比较失败了:

timestamp.strftime('%Y-%m-%d %H:%M:%S.%L') = "2014-08-02 10:23:17.000"
started_at.strftime('%Y-%m-%d %H:%M:%S.%L') = "2014-08-02 10:23:17.679"

这一发现使我走上了一条奇怪的道路,最终发现了导致问题的最终原因。这是在测试期间和使用 MySQL 作为我的数据库时发生的问题的组合。

问题仅在测试中出现,因为在出​​现此问题的测试中,我正在针对包含上述字段的几个关联模型运行一些测试。一个模型的实例必须在测试期间保存到数据库中——包含 timestamp 值的模型。然而,另一个模型正在执行处理,因此正在自引用在测试代码中创建的自身实例。

这导致了第二个罪魁祸首,即我使用 MySQL 作为数据库,当存储 datetime 值时,存储毫秒信息(不像,比如 PostgreSQL)。

不变的是,这意味着从 MySQL 数据库检索到其 ActiveRecord 后读取的 timestamp 变量实际上被四舍五入并去除了毫秒数据,而 started_at 变量在测试期间仅保留在内存中,因此原始毫秒数仍然存在。

我自己的(低于标准)解决方案基本上是在我的测试中强制两个模型(而不是一个)从数据库中检索它们自己。

TLDR;尽可能使用 PostgreSQL!

关于ruby-on-rails - rails/ ruby : TimeWithZone comparison inexplicably failing for equivalent values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25078772/

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