关于ruby:对比较返回false的date.end_of_day.to_datetime和date.to_datetime.end_of_day返回的日期对象值进行设置

Rails on date object values returned by date.end_of_day.to_datetime and date.to_datetime.end_of_day when compared returns false

ruby1.9.3dev(2011-09-23修订版33323)[i686-linux]

导轨3.0.20

最近为什么要在与Rails上的DateTime相关的RSpec上进行项目开发,我发现
在给定的日期,以下语句发出的值

1
    date.end_of_day.to_datetime

1
    date.to_datetime.end_of_day

当比较时返回false,尽管它们表示相同的日期时间。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  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失败。

谢谢,

吉涅什


尽管它们的字符串表示形式相同,但d1_eod_datetime不等于d2_eod_datetime。它们的最低有效位不同。如果将日期时间转换为浮点表示形式,则可以看到它们不相等:

1
2
3
4
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实例不完全相同。