gpt4 book ai didi

ruby - Rails 比较 date.end_of_day.to_datetime 和 date.to_datetime.end_of_day 返回的日期对象值时返回 false

转载 作者:数据小太阳 更新时间:2023-10-29 07:07:51 32 4
gpt4 key购买 nike

ruby 1.9.3dev(2011-09-23 修订版 33323)[i686-linux]

轨道 3.0.20

最近为什么在与 DateTime on Rails 相关的 RSpecs 项目上工作我发现在给定日期以下语句发出的值

    date.end_of_day.to_datetime

    date.to_datetime.end_of_day

虽然它们表示相同的日期时间,但比较时返回 false。

为了确认这一点,我打开了 Rails 控制台并尝试了以下操作

  1.9.3dev :053 > monday = Time.now.monday
=> 2013-02-25 00:00:00 +0530

1.9.3dev :054 > monday.class
=> Time

1.9.3dev :055 > d1 = monday + 1.hour
=> 2013-02-25 01:00:00 +0530

1.9.3dev :056 > d2 = monday + 1.hour
=> 2013-02-25 01:00:00 +0530

1.9.3dev :058 > d1_eod_datetime = d1.end_of_day.to_datetime
=> Mon, 25 Feb 2013 23:59:59 +0530

1.9.3dev :059 > d2_eod_datetime = d2.to_datetime.end_of_day
=> Mon, 25 Feb 2013 23:59:59 +0530

1.9.3dev :061 > d1_eod_datetime == d2_eod_datetime
=> false

1.9.3dev :062 > d3_eod_datetime = d2.to_datetime.end_of_day
=> Mon, 25 Feb 2013 23:59:59 +0530

1.9.3dev :063 > d2_eod_datetime == d3_eod_datetime
=> true

看来我的观察是正确的。那就是:

比较 d1_eod_datetime 和 d2_eod_datetime返回 false

当比较 d2_eod_datetime 和 d3_eod_datetime 时,它返回 true

这对我来说似乎是一种不一致的行为,但是如果任何人都可以让我了解幕后发生的事情以及为什么使用 date.end_of_day.to_datetimedate.to_datetime.end_of_day 失败,尽管源 date 对象表示相同的日期时间。

谢谢,

吉涅什

最佳答案

虽然它们的字符串表示相同,但​​ d1_eod_datetime 不等于 d2_eod_datetime。它们的最低有效位不同。如果将日期时间转换为浮点表示,您会发现它们不相等:

d1_eod_datetime.to_f
=> 1381788000.0
d2_eod_datetime.to_f
=> 1381787999.0

Time 实例接收到 end_of_day 消息时,就会出现问题。将 end_of_day 消息传递给 Time 实例会返回一个 DateTime 实例。转换为 DateTime 可能会导致准确性下降,并且新的 DateTime 实例可能不完全等于您的原始 Time 实例。

关于ruby - Rails 比较 date.end_of_day.to_datetime 和 date.to_datetime.end_of_day 返回的日期对象值时返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15130932/

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