EDIT 2009-ноябрь-04
ОК, так что прошло немного времени, так как я впервые разместил этот вопрос. Мне кажется, что многие из первоначальных респондентов не смогли действительно получить то, что я говорил, - общий ответ заключался в том, что некоторые варианты "То, что вы говорите, не имеет никакого смысла" - и поэтому я сделал несколько удобных диаграммы, чтобы действительно проиллюстрировать мою точку зрения.
Когда мы говорим о числах, мы, как правило, ссылаемся на точки, которые учатся в школьных школах, называются Number Line:
Теперь, когда мы изучаем арифметику, наши умы учатся выполнять очень интересную трансформацию этой концепции. Выравнивание выражения 1 + 0.5
, например, если мы просто применили наше "мышление с числовой строкой", потребовало бы, чтобы мы как-то поняли это:
Трудно реально проиллюстрировать это, потому что трудно думать об этом: "добавив" два очка. Именно здесь многие респонденты боролись с идеей добавления дат (или просто отклонили ее как абсурдной), потому что они думали о датах как о точках.
Однако выражение 1 + 0.5
имеет смысл для нас, потому что, когда мы об этом думаем, мы действительно представляем это:
То есть, число (или точка) 1, плюс vector 0.5, в результате получится точка 1.5.
В качестве альтернативы мы можем представить себе это:
То есть вектор 1 плюс вектор 0,5, в результате получившийся вектор 1.5.
Другими словами, при рассмотрении чисел мы обрабатываем точки и векторы взаимозаменяемо. Но как насчет дат? Даты, в конце концов, в основном номера. Если вы мне не верите, сравните эту строку с строкой числа выше:
Обратите внимание на соответствие между временной шкалой и числовой строкой? Это была моя точка зрения: если мы выполним преобразование выше с числами, мы должны иметь возможность делать это и с датами. Итак, применяя "мышление временной шкалы", выражение 0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00
не имеет большого смысла, поскольку многие респонденты отметили:
Но, если мы делаем ту же концептуальную трансформацию в нашей голове, которую мы выполняем каждый раз, когда добавляем или вычитаем числа, мы можем легко "переосмыслить" сказанное выше:
Так ясно, что разница между a DateTime
и a TimeSpan
является той же разницей, которая существует между точкой и вектором. Я думаю, что многие люди отрицательно откликаются на мое предложение, так это то, что просто так неестественно думать о датах как величинах таким образом. Но я не покупаю аргумент о том, что нет очевидной точки отсчета для использования в качестве нуля. Есть очевидная контрольная точка, и я дам вам подсказку, где она находится: около 2010 лет назад.
Не поймите меня неправильно: я не стану сомневаться в полезности рисования концептуального разрыва между понятиями DateTime
и a TimeSpan
. Действительно, мой вопрос всегда должен был (как косвенно предложил ChrisW), почему мы рассматриваем числа и векторы взаимозаменяемо при работе с обычными числовыми типами? (Или: почему у нас есть только один тип int
вместо int
и intspan
?). Там большая разница, и все же мы никогда не думаем об этом до тех пор, пока в младшей школе или средней школе, когда мы начнем геометрию. И тогда он рассматривался как эта новая математическая концепция, когда на самом деле это то, что мы использовали с тех пор, как мы научились добавлять числа, сославшись пальцами.
В конце концов, лучший ответ пришел из Strilanc, который указал, что использование DateTime
и TimeSpan
на самом деле является реализация аффинное пространство, которое обладает удобным свойством не нуждаться в контрольной точке для обработки в качестве источника. Так что спасибо, Стриланк. Тем не менее, я даю принятый ответ ChrisW для того, чтобы быть первым, кто воспитывал концепцию векторов и точек, что действительно дошло до сути дела.
ОРИГИНАЛЬНЫЙ ВОПРОС (для потомков)
Я, разумеется, не является программным ящиком всех профессий, но я знаю, что как PHP, так и .NET имеют класс TimeSpan
в дополнение к классу DateTime
(или структуре в .NET), и я предполагаю, что это случай в целом ряде других языков и фреймворков (хотя я пишу это прежде всего со ссылкой на структуры .NET). Это может показаться странным вопросом, но не является TimeSpan
избыточным?
Если вы считаете, что ответ очевиден ( "A DateTime
- абсолютная точка во времени, а TimeSpan
- это диапазон времени - простой, как это!" ), рассмотрите это: целое число может быть концептуализируется как абсолютная величина (точка в числовой строке), так и расстояние между значениями - и нам не нужны два отдельных типа данных для этих различных концептуализаций. Я все еще могу написать 5 + 6 без какой-либо двусмысленности относительно того, что я имею в виду.
Пока существует согласованная нулевая ссылка, мне кажется, не должно быть причин, по которым для выполнения арифметических операций над объектами DateTime
нужен объект TimeSpan
или для получения расстояния между ними.
Что мне не хватает? Почему уникальные методы и свойства структуры TimeSpan
не могут быть сгруппированы в DateTime
?
(Отказ от ответственности: это не то, что я увлечен этим или чем-то другим, я прекрасно использую объекты DateTime
и TimeSpan
, поскольку они предназначены все время. Я просто задаю вопрос. )
РЕДАКТИРОВАТЬ. Хорошо, упрощенный пример для иллюстрации моей точки:
Рассмотрим уравнение 10 - 5 = 5. Можно было бы прочитать это как "Начать с 10 (значение), переместить 5 влево (диапазон), и вы закончите с 5 (значение)".
Предположим, просто для облегчения, мы даем 1 января 1900 г. нулевую точку и определяем объекты TimeSpan
только по дням.
Тогда 10 - 5 = 5 можно было бы понимать в терминах DateTime
, начиная с 11 января 1900 года - 6 января 1900 года = 6 января 1900 года. Это хорошо, потому что 11 января - это всего лишь "10" по нашему определению и 6 января - "5" . Тот факт, что мы рассматриваем значение 10 как значение, первые 5 как промежуток, а последние 5 как значение снова - это просто для нашей собственной концептуальной выгоды. Моя точка зрения заключается только в том, что единственная разница заключается в том, как вы думаете о количестве, а не о том, что это на самом деле. Вот почему у нас нет отдельных структур для, скажем, целых значений и целых пространств - простое старое целое охватывает все наши базы.
Есть ли смысл?