РЕДАКТИРОВАТЬ 2009-Nov-04
Хорошо, прошло немного времени с тех пор, как я впервые опубликовал этот вопрос. Мне кажется, что многие из первых респондентов не смогли по-настоящему понять то, что я говорил - общим ответом было какое-то изменение «То, что вы говорите, не имеет никакого смысла» - и поэтому я сделал несколько полезных диаграммы, которые действительно иллюстрируют мою точку зрения.
Когда мы говорим о числах, мы обычно имеем в виду пункты о том, что дети начальных классов изучают, называется Числовой линией:
Теперь, когда мы изучаем арифметику, наши умы учатся выполнять очень интересные преобразования этой концепции. Например, для оценки выражения 1 + 0.5
, если бы мы просто применили наше «мышление числовой линии», нам бы потребовалось как-то разобраться в этом:
Трудно действительно проиллюстрировать это, потому что трудно подумать об этом: «добавление» двух пунктов. Именно здесь многие респонденты боролись с идеей добавления дат (или просто отклонили это как абсурдное), потому что они думали о датах как о точках.
Однако выражение 1 + 0.5
действительно имеет для нас смысл, потому что, когда мы думаем об этом, мы действительно воображаем это:
То есть число (или точка ) 1 плюс вектор 0,5, в результате чего точка 1,5.
С другой стороны, мы можем представить себе это:
То есть вектор 1 плюс вектор 0,5, что приводит к вектору 1,5.
Другими словами, когда мы имеем дело с числами, мы рассматриваем точки и векторы взаимозаменяемо. Но как насчет дат? Даты, в конце концов, в основном числа. Если вы мне не верите, сравните эту строку с числовой строкой выше:
Заметили соответствие между временной шкалой и числовой линией? Это была моя точка зрения: если мы выполним преобразование выше с числами , мы должны быть в состоянии сделать это и с датами. Таким образом, применяя «мышление по временной шкале», выражение 0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00
не имеет большого смысла, как отметили многие респонденты:
Но , если мы делаем то же самое концептуальное преобразование в нашей голове, которое мы выполняем каждый раз, когда добавляем или вычитаем числа , мы можем легко «переосмыслить» вышеприведенное, как это:
Очевидно, что разница между DateTime
и TimeSpan
- это та же разница, которая существует между точкой и вектором. Я думаю, что многие люди негативно отреагировали на моё предположение о том, что просто так неестественно думать о датах как о величинах таким образом. Но я не согласен с аргументом о том, что нет очевидного ориентира для использования в качестве нуля. Существует очевидный ориентир, и я дам вам подсказку, где он находится: около 2010 года назад.
Не поймите меня неправильно: я не подвергаю сомнению полезность в проведении концептуального разрыва между понятиями DateTime
и TimeSpan
. Действительно, мой вопрос должен был быть (как косвенно предложил ChrisW), почему do мы рассматриваем числа и векторы взаимозаменяемо при работе с обычными числовыми типами? (Или: почему у нас только один тип int
вместо int
и intspan
?) Есть большая разница, и все же мы никогда не думаем об этом, пока в какой-то средней или старшей школе, когда мы начинаем геометрию. И затем это воспринимается как новая математическая концепция, когда в действительности это то, что мы используем с тех пор, как научились добавлять числа, считая их пальцами.
В конце концов, лучший ответ пришел от Strilanc, который указал, что использование DateTime
и TimeSpan
действительно является реализацией аффинного пространства , которое имеет удобное свойство не нуждающихся в контрольную точку, чтобы рассматривать в качестве начала координат. Так что спасибо, Стриланк. Тем не менее, я даю признанный ответ ChrisW за то, что был первым, кто поднял концепцию векторов и точек, которая действительно добралась до сути вопроса.
ОРИГИНАЛЬНЫЙ ВОПРОС (для потомков)
Я, конечно, не умею программировать на все руки, но я знаю, что и PHP, и .NET имеют класс TimeSpan
в дополнение к классу DateTime
(или структуре в .NET), и я предполагаю, что это случай в различных других языках и фреймворках, а также (хотя я пишу это в первую очередь со ссылкой на структуры .NET). Это может показаться странным вопросом, но не является ли TimeSpan
избыточным?
Если вы считаете, что ответ очевиден («A DateTime
- абсолютный момент времени, а TimeSpan
- интервал времени - такой простой!»), Учтите следующее: целое число может быть концептуализируется как абсолютное значение (точка на числовой линии) или как расстояние между значениями - и нам не нужны два отдельных типа данных для этих различных концептуализаций. Я все еще могу написать 5 + 6 без какой-либо двусмысленности относительно того, что я имею в виду.
До тех пор, пока существует постоянная ссылка на нулевую точку, мне кажется, не должно быть никаких причин, по которым нужен объект TimeSpan
для выполнения арифметических операций над DateTime
объектами или для получения расстояния между ними .
Что мне не хватает? Почему уникальные методы и свойства структуры 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 как span , а последние 5 как значение снова, просто для нашего собственного концептуальная выгода. Суть в том, что единственное различие заключается в том, как вы думаете о числе, а не в том, как оно есть на самом деле. Вот почему у нас нет отдельных структур, скажем, для целочисленных значений и целых интервалов - простое старое целое число охватывает все наши базы.
Имею ли я какой-то смысл?