为什么Ruby';s stdlib有DateTime类吗?

为什么Ruby';s stdlib有DateTime类吗?,ruby,datetime,Ruby,Datetime,不久前,我深深地挖掘了这片土地。在四处打听之后,我得出了这样的结论:没有充分的理由使用DateTime 这个问题本质上与上述问题相反: 当日期和时间可以做得很好,而且更好时,为什么最初将DateTime添加到stdlib中?谁真正使用了DateTime(以及为了什么)使得它继续在stdlib中占有一席之地?DateTime作为Rails的一种东西被普及,它被创建为围绕数据库中的等价的DateTime列。就日期范围而言,这些列比Time灵活得多,因此需要一种新类型来捕获所有可能的值。在Ruby 1

不久前,我深深地挖掘了这片土地。在四处打听之后,我得出了这样的结论:没有充分的理由使用DateTime

这个问题本质上与上述问题相反:


当日期和时间可以做得很好,而且更好时,为什么最初将
DateTime
添加到stdlib中?谁真正使用了DateTime(以及为了什么)使得它继续在stdlib中占有一席之地?

DateTime作为Rails的一种东西被普及,它被创建为围绕数据库中的等价的
DateTime
列。就日期范围而言,这些列比
Time
灵活得多,因此需要一种新类型来捕获所有可能的值。在Ruby 1.8.6和1.8.7的早期版本中,times被限制在标准1901-2038范围内,内部表示为无符号长(32位)数

现在,差异大多很小,尽管在Rails中,大多数时间计算方法都是DateTime


我真的不会担心你使用哪种日期时间或时间,除非你有特别好的理由选择其中一种。如果您要从Rails获取DateTime对象,请按照流程使用这些对象。如果您正在构建自己的Ruby应用程序,您可以随心所欲。

这是错误的。Rails使用
ActiveSupport::TimeWithZone
。是的,时区处理并不总是存在,但是
DateTime
早于Rails。请参阅[.如果您仔细研究,DateTime也有严重的缺陷。从历史上看,您可能会对使用
DateTime
的更大日期范围有看法,但即使在1.8.7(我现在安装的唯一“旧”ruby)中,我也可以创建
Time.utc(-2500,12,31,12,34,56)
just fine:可能是64位操作系统的问题?我不确定时间是什么时候被修补的,以适应更大的范围,但原始版本是严格的32位签名,会在1901到2038之间的值中出错。这可能是Ruby 1.9的修复,它已经被移植到1.8.7系列中。在1.8.6中进行测试会产生错误“RangeError:bignum太大,无法转换为'long'”。Re:“Rails中的大多数计算方法都是DateTime”,我看到:,甚至ActiveSupport的
DateTime#advance
(我也不喜欢DateTime)我可能需要深入研究Date、DateTime、TimeWithZone和Time的内部结构,以找出Rails 3.2和Ruby 1.9.3中的现状。似乎很多事情都发生了变化。不过,我敢打赌这仍然是一场火车失事,因为时间和日期是最模糊的事情之一。