Rails处理date.end_of_day返回的日期对象值.To_datetime和date.to_datetime.


ruby 1.9.3dev (2011-09-23 revision 33323) [i686-linux] Rails 3.0.20

最近,为什么在一个与Rails上的DateTime相关的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_datetime date.to_datetime。end_of_day失败,尽管源date对象表示相同的日期-时间。

谢谢,

Jignesh

虽然它们的字符串表示是相同的,但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实例。

相关内容

  • 没有找到相关文章

最新更新