导轨相比返回false
问题描述:
红宝石1.9.3dev(2011-09-23的修订33323)[i686的Linux的]导轨相比返回false
当由date.end_of_day.to_datetime和date.to_datetime.end_of_day返回Rails的3.0.20
为什么最近在一个项目上工作on Rails的有关日期时间RSpecs我发现,在给定日期 通过下面的语句
发出的值和
相比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
,似乎我的观察看correct.That是:
当d1_eod_datetime和d2_eod_datetime比较它返回false
当d2_eod_datetime和d3_eod_datetime是compa红其返回true
看起来不一致的行为给我,但是希望如果有人 可以让我明白是怎么回事幕后,为什么值进行了比较 使用date.end_of_day。 to_datetime和 date.to_datetime.end_of_day虽然来源日期对象表示相同的日期时间。
感谢,
Jignesh
答
虽然他们的字符串表现是一样的,d1_eod_datetime
不等于d2_eod_datetime
。它们的最低有效位不同。如果您转换您的日期时间为float表示,你可以看到,他们是不相等的:
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
实例。
查看相关问题:http://stackoverflow.com/questions/8763050/how-to-compare-time-in-ruby – kristinalim 2013-09-21 23:04:30