Jig*_*hel 6 ruby datetime activesupport ruby-on-rails-3
ruby 1.9.3dev(2011-09-23修订版33323)[i686-linux]
Rails 3.0.20
最近为什么在Rails上与DateTime相关的RSpec项目上我发现 在给定的日期,以下语句发出的值
date.end_of_day.to_datetime
Run Code Online (Sandbox Code Playgroud)
和
date.to_datetime.end_of_day
Run Code Online (Sandbox Code Playgroud)
当比较返回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
Run Code Online (Sandbox Code Playgroud)
看来我的观察看起来是正确的.那就是:
当比较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对值进行的比较会因为源日期对象而 失败,我将不胜感激.表示相同的日期时间.
谢谢,
Jignesh
虽然它们的字符串表示形式相同,d1_eod_datetime但不等于d2_eod_datetime。它们的不同之处在于最低有效位。如果将日期时间转换为浮点表示形式,您可以看到它们不相等:
d1_eod_datetime.to_f
=> 1381788000.0
d2_eod_datetime.to_f
=> 1381787999.0
Run Code Online (Sandbox Code Playgroud)
Time当实例收到消息时就会出现问题end_of_day。将end_of_day消息传递给Time实例会返回一个DateTime实例。转换DateTime可能会导致准确性损失,并且新DateTime实例可能不完全等于原始Time实例。