EDIT 2009-Ноябрь-04Не нужен TimeSpan?
ОК, так что это было некоторое время, так как я первый отвечал на этот вопрос. Мне кажется, что многие из первоначальных респондентов не смогли действительно получить то, что я говорил, - общий ответ заключался в том, что некоторые варианты «То, что вы говорите, не имеет никакого смысла» - и поэтому я сделал несколько удобных диаграммы, чтобы действительно проиллюстрировать мою точку зрения.
Когда мы говорим о числах, мы, как правило, ссылаясь на точки на каком классе школы дети учатся называется номер строки:
Теперь, когда мы узнаем, арифметику, наши умы учатся выполнить очень интересная трансформация этой концепции. Evalutating выражения 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
и TimeSpan
- та же разница, что существует между точкой и вектором. Я думаю, что многие люди отрицательно откликаются на мое предложение, так это то, что просто так неестественно думать о датах как величинах таким образом. Но я не покупаю аргумент, что нет очевидной точки отсчета для использования в качестве нуля. Существует очевидная контрольная точка, и я дам вам подсказку, где она находится: около 2010 года назад.
Не поймите меня неправильно: я не ставлю под сомнение полезности составления концептуального разрыва между понятием DateTime
и TimeSpan
. Действительно, мой вопрос должен был быть (как было сказано в ChrisW), почему do мы обрабатываем числа и векторы взаимозаменяемо при работе с обычными числовыми типами? (Или: почему у нас есть только один тип int
, а не int
и intspan
?) Есть большая разница, и все же мы никогда не думаем об этом до тех пор, пока в младшей школе или средней школе, когда мы начнем геометрию. И тогда это рассматривается как эта новая математическая концепция, когда на самом деле это то, что мы используем с тех пор, как мы научились добавлять числа, сославшись пальцами.
В конце концов, лучший ответ пришел из Strilanc, который указал, что использование DateTime
и TimeSpan
действительно является реализация affine space, которая имеет удобное свойство не нуждаясь в контрольную точку для лечения, как происхождение. Так что спасибо, Стриланк. Тем не менее, я даю принятый ответ 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 как значение снова просто для нашей собственной концептуальной выгоды. Моя точка зрения заключается только в том, что единственная разница заключается в том, как вы думаете о количестве, а не о том, что это на самом деле. Вот почему у нас нет отдельных структур, например, целочисленных значений и целочисленных пространств - простое старое целое охватывает все наши базы.
Имею ли я смысл?
@ Хенк: Ха-ха, не притворяйся, что это не будет потрясающе. –
Сколько вторников существует в течение 10 дней? – recursive
@recursive: как все говорили все время, это зависит от вашей нулевой точки, которую .NET имеет в понедельник, 01 января 0001 (DateTime.MinValue), поэтому ответ будет равен 2. Но, похоже, вы пытаетесь вызывать что-то бессмысленное в моем вопросе; Поэтому я попрошу вас повторить, почти идентичный вопрос, чтобы проиллюстрировать МОЙ пункт: Сколько кратных 5 в промежутке 8? –