【发布时间】:2014-08-01 10:58:41
【问题描述】:
在我当前的项目中比较 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
to_datetime:
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
非常感谢任何建议!
【问题讨论】:
-
我强烈怀疑这些值在几分之一秒内不同。尝试使用
to_f而不是to_i,您可能会看到不同之处。或者将它们格式化为包含几分之一秒。 -
@JonSkeet 你明白了,非常感谢!我在对原始帖子的编辑中详细说明了细节,但长话短说是从数据库中检索一个值,另一个在内存中,由于我在 MySQL 上运行,毫秒数据只被截断了一个值,但是不是两者。
-
@GabeStah 你应该发布你的解决方案作为答案
标签: ruby-on-rails ruby datetime comparison