Rails / Ruby:TimeWithZone比较莫名其妙地失败了等效值

加贝斯塔

我在当前项目中的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

我在搜索中找到的最接近答案(两个ActiveSupport :: TimeWithZone对象之间的比较失败)在此处表示相同的问题,并且我尝试了适用的解决方案,但未成功(尝试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

任何建议将不胜感激!

加贝斯塔

解决了

如上面的乔恩·斯基特(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不同)。

始终,这意味着timestamp从MySQL数据库检索其ActiveRecord之后正在读取变量实际上已被四舍五入并削减了毫秒数据,而started_at在测试过程中变量仅保留在内存中,因此原始毫秒仍当下。

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

TLDR;如果可以,请尽可能使用PostgreSQL!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rails路由助手在请求之前莫名其妙地使用了“后安装”

来自分类Dev

Rails路由助手莫名其妙地将“ postinstall”添加到请求中

来自分类Dev

Jquery 表单提交不能使用 AJAX 和 Rails 莫名其妙地重新渲染 index.html.erb

来自分类Dev

Javac 在 Hudson 上莫名其妙地失败了

来自分类Dev

jQuery .empty() && .append() 莫名其妙地失败

来自分类Dev

比较Ruby / Rails TimeWithZone对象

来自分类Dev

文本莫名其妙地忽略了其容器的边界

来自分类Dev

自定义函数会莫名其妙地停止某些值的工作

来自分类Dev

C代码莫名其妙地跳过了行

来自分类Dev

pandas.merge莫名其妙地缓慢

来自分类Dev

OpenGL矩形莫名其妙地占据了整个窗口

来自分类Dev

C代码莫名其妙地跳过了行

来自分类Dev

PHP 变量莫名其妙地更新

来自分类Dev

as.POSIXct 给出了莫名其妙的 NA 值

来自分类Dev

isKindOfClass莫名其妙的身份问题

来自分类Dev

bash:莫名其妙的行为

来自分类Dev

tar莫名其妙地试图打开一个不存在的目录

来自分类Dev

ComputeHash调用莫名其妙地有所不同

来自分类Dev

画布drawImage莫名其妙地偏移了1个像素

来自分类Dev

UITapGestureRecognizer莫名其妙地停止识别轻击手势

来自分类Dev

yarn / npm在摩卡和打字稿中莫名其妙地使用了过时的代码

来自分类Dev

应用于元组的map函数总是莫名其妙地评估为True

来自分类Dev

Grails发布莫名其妙地无法发布到Nexus

来自分类Dev

tar莫名其妙地试图打开一个不存在的目录

来自分类Dev

油煎面包块显示不正确-CroutonQueue莫名其妙地卡住了?

来自分类Dev

草绘为XCode图像大小?(莫名其妙)

来自分类Dev

数组和循环中输出的莫名其妙的变化

来自分类Dev

莫名其妙的行为国防部重写

来自分类Dev

WebClient.DownloadFile的莫名其妙的行为

Related 相关文章

  1. 1

    Rails路由助手在请求之前莫名其妙地使用了“后安装”

  2. 2

    Rails路由助手莫名其妙地将“ postinstall”添加到请求中

  3. 3

    Jquery 表单提交不能使用 AJAX 和 Rails 莫名其妙地重新渲染 index.html.erb

  4. 4

    Javac 在 Hudson 上莫名其妙地失败了

  5. 5

    jQuery .empty() && .append() 莫名其妙地失败

  6. 6

    比较Ruby / Rails TimeWithZone对象

  7. 7

    文本莫名其妙地忽略了其容器的边界

  8. 8

    自定义函数会莫名其妙地停止某些值的工作

  9. 9

    C代码莫名其妙地跳过了行

  10. 10

    pandas.merge莫名其妙地缓慢

  11. 11

    OpenGL矩形莫名其妙地占据了整个窗口

  12. 12

    C代码莫名其妙地跳过了行

  13. 13

    PHP 变量莫名其妙地更新

  14. 14

    as.POSIXct 给出了莫名其妙的 NA 值

  15. 15

    isKindOfClass莫名其妙的身份问题

  16. 16

    bash:莫名其妙的行为

  17. 17

    tar莫名其妙地试图打开一个不存在的目录

  18. 18

    ComputeHash调用莫名其妙地有所不同

  19. 19

    画布drawImage莫名其妙地偏移了1个像素

  20. 20

    UITapGestureRecognizer莫名其妙地停止识别轻击手势

  21. 21

    yarn / npm在摩卡和打字稿中莫名其妙地使用了过时的代码

  22. 22

    应用于元组的map函数总是莫名其妙地评估为True

  23. 23

    Grails发布莫名其妙地无法发布到Nexus

  24. 24

    tar莫名其妙地试图打开一个不存在的目录

  25. 25

    油煎面包块显示不正确-CroutonQueue莫名其妙地卡住了?

  26. 26

    草绘为XCode图像大小?(莫名其妙)

  27. 27

    数组和循环中输出的莫名其妙的变化

  28. 28

    莫名其妙的行为国防部重写

  29. 29

    WebClient.DownloadFile的莫名其妙的行为

热门标签

归档