编辑 2009 年 11 月 4 日
好的,所以自从我第一次发布这个问题以来已经有一段时间了。在我看来,许多最初的响应者并没有真正理解我在说什么——一个常见的反应是“你所说的没有任何意义”的一些变化——所以我做了一些方便图表来真正说明我的观点。
当我们谈到数字时,我们通常指的是小学生学习的点,称为数字线:
现在,当我们学习算术时,我们的大脑学会了对这个概念进行非常有趣的转换。评估表达式1 + 0.5
,例如,如果我们简单地应用我们的“数轴思维”,将需要我们以某种方式理解这一点:
很难真正说明这一点,因为很难想到:“添加”两点。这就是许多响应者为添加日期的想法而苦苦挣扎的地方(或者干脆认为这是荒谬的),因为他们将日期视为点。
然而,这个表达对我们来说1 + 0.5
确实有意义,因为当我们想到它时,我们真的在想象这个:
也就是说,数字(或点)1,加上向量0.5,得到点1.5。
或者,我们可能会这样想象:
即向量1,加上向量0.5,得到向量1.5。
换句话说,在处理数字时,我们可以互换地处理点和向量。但是日期呢?毕竟,日期基本上是数字。如果您不相信我,请将此行与上面的数字行进行比较:
注意到时间线和数轴之间的对应关系了吗?这是我的观点:如果我们用numbers执行上述转换,我们也应该能够用 date 来做。0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00
因此,正如许多响应者指出的那样,应用“时间线思维”,这种表达方式并没有多大意义:
但是,如果我们在头脑中进行与每次加减数字时相同的概念转换,我们可以轻松地“重新考虑”上述内容:
很明显,aDateTime
和 a之间TimeSpan
的差异与点和向量之间存在的差异相同。我认为导致很多人对我的建议做出负面反应的原因是,以这种方式将日期视为数量级是非常不自然的。但我不认同没有明显参考点可用作零的论点。有一个明显的参考点,我会给你一个提示:大约 2010 年前。
不要误会我的意思:我并不是在质疑在a和 a的概念之间划出概念鸿沟的有用性。真的,我的问题一直应该是(正如 ChrisW 间接建议的那样),为什么我们在处理常规数字类型时要互换处理数字和向量?(或者:为什么我们只有一种类型,而不是和?)有很大的不同,但直到初中或高中的某个时候,当我们开始几何时,我们才真正考虑过它。然后它被视为这个新的数学概念,而实际上,自从我们学会用手指数数来添加数字以来,我们就一直在使用它。DateTime
TimeSpan
int
int
intspan
最后,最好的答案来自 Strilanc,他指出使用DateTime
andTimeSpan
是仿射空间的一种实现,它具有不需要参考点作为原点的方便属性。所以谢谢,斯特兰克。然而,我将接受的答案交给 ChrisW,因为他是第一个提出向量和点概念的人,这确实触及了问题的症结所在。
原始问题(为后代)
我当然不是所有行业的编程专家,但我知道 PHP 和 .NETTimeSpan
除了一个DateTime
类(或 .NET 中的结构)之外还有一个类,我猜在各种其他语言和框架中都是这种情况以及(尽管我主要参考 .NET 结构来编写此内容)。这似乎是一个奇怪的问题,但不是TimeSpan
多余的吗?
如果您认为答案很明显(“ADateTime
是一个绝对时间点,而 aTimeSpan
是一个时间范围——就这么简单!”),请考虑一下:整数可以概念化为绝对值(点在数轴上)或值之间的距离——对于这些不同的概念化,我们不需要两种单独的数据类型。我仍然可以毫不含糊地写出 5 + 6 的意思。
只要有一个一致的零点引用,在我看来,就没有理由需要一个TimeSpan
对象来对对象执行算术运算DateTime
,或者获取它们之间的距离。
我错过了什么?为什么不能TimeSpan
简单地将结构的独特方法和属性折叠成DateTime
?
(免责声明:这不像我对这个或任何东西充满热情;我一直很好地使用DateTime
和TimeSpan
对象,因为它们一直都是预期的。我只是在问一个问题。)
编辑:好的,过度简化的例子来说明我的观点:
考虑等式 10 - 5 = 5。可以将其解读为“从 10(值)开始,将 5 向左移动(跨度),最终到 5(值)”。
假设,为了简单起见,我们将 1900 年 1 月 1 日设为零点,并且TimeSpan
仅以天为单位定义对象。
那么 10 - 5 = 5 可以理解DateTime
为 1900 年 1 月 11 日 - 1900 年 1 月 6 日 = 1900 年 1 月 6 日。这很好,因为根据我们的定义,1 月 11 日只是“10”,而 1 月 6 日是“5”。我们将 10 视为value,前 5 视为span,最后 5 再次视为value的事实仅仅是为了我们自己的概念利益。我的观点是这样的:唯一的区别在于你如何看待这个数字,而不是它实际上是什么。这就是为什么我们没有单独的结构,比如整数值和整数跨度——一个普通的旧整数覆盖了我们所有的基础。
我说得有道理吗?