Подтвердить что ты не робот

Не требуется ли TimeSpan?

EDIT 2009-ноябрь-04

ОК, так что прошло немного времени, так как я впервые разместил этот вопрос. Мне кажется, что многие из первоначальных респондентов не смогли действительно получить то, что я говорил, - общий ответ заключался в том, что некоторые варианты "То, что вы говорите, не имеет никакого смысла" - и поэтому я сделал несколько удобных диаграммы, чтобы действительно проиллюстрировать мою точку зрения.

Когда мы говорим о числах, мы, как правило, ссылаемся на точки, которые учатся в школьных школах, называются Number Line:

The number line

Теперь, когда мы изучаем арифметику, наши умы учатся выполнять очень интересную трансформацию этой концепции. Выравнивание выражения 1 + 0.5, например, если мы просто применили наше "мышление с числовой строкой", потребовало бы, чтобы мы как-то поняли это:

Adding two points on the number line

Трудно реально проиллюстрировать это, потому что трудно думать об этом: "добавив" два очка. Именно здесь многие респонденты боролись с идеей добавления дат (или просто отклонили ее как абсурдной), потому что они думали о датах как о точках.

Однако выражение 1 + 0.5 имеет смысл для нас, потому что, когда мы об этом думаем, мы действительно представляем это:

Adding a number (point) and a magnitude (vector)

То есть, число (или точка) 1, плюс vector 0.5, в результате получится точка 1.5.

В качестве альтернативы мы можем представить себе это:

Adding two vectors

То есть вектор 1 плюс вектор 0,5, в результате получившийся вектор 1.5.

Другими словами, при рассмотрении чисел мы обрабатываем точки и векторы взаимозаменяемо. Но как насчет дат? Даты, в конце концов, в основном номера. Если вы мне не верите, сравните эту строку с строкой числа выше:

A timeline

Обратите внимание на соответствие между временной шкалой и числовой строкой? Это была моя точка зрения: если мы выполним преобразование выше с числами, мы должны иметь возможность делать это и с датами. Итак, применяя "мышление временной шкалы", выражение 0001-Jan-02 00:00:00 + 0001-Jan-01 12:00:00 не имеет большого смысла, поскольку многие респонденты отметили:

Adding two points on a timeline

Но, если мы делаем ту же концептуальную трансформацию в нашей голове, которую мы выполняем каждый раз, когда добавляем или вычитаем числа, мы можем легко "переосмыслить" сказанное выше:

Adding a point in time and a time vector

Так ясно, что разница между 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 как значение снова - это просто для нашей собственной концептуальной выгоды. Моя точка зрения заключается только в том, что единственная разница заключается в том, как вы думаете о количестве, а не о том, что это на самом деле. Вот почему у нас нет отдельных структур для, скажем, целых значений и целых пространств - простое старое целое охватывает все наши базы.

Есть ли смысл?

4b9b3361

Ответ 1

рассмотрим это: целое число может быть концептуализировано как абсолютное значение (точка на числовой строке) или расстояние между значениями

По вашей логике, это не TimeSpan, что это необходимо: скорее это DateTime, что ненужно, и может быть заменено TimeSpan (длительность с нуля).

Кроме того, существует тот факт, что целые числа имеют очевидный нуль, тогда как даты, однако, не имеют очевидного нуля; но наличие очевидного нуля необходимо, если вы хотите заменить "место на числовой строке" на "расстояние/диапазон от нуля/происхождение".


Edit:

Точка (местоположение на плоскости) не совпадает с вектором.

Они кажутся похожими...

  • Вектор (расстояние от источника) может представлять точку
  • Точка (относительно начала координат) может представлять вектор

... однако значение вектора, которое требуется для представления данной точки, изменится, если происхождение изменится.

Всегда имеет смысл добавить два (относительных) вектора; но нет смысла добавлять две точки, кроме как путем преобразования этих точек в векторы и затем добавления векторов.

Сумма двух векторов не зависит от изменения начала, но сумма двух точек будет зависеть от изменения источника, если вы суммировали их, преобразовывая их в векторы и добавляя векторы (поскольку изменение начала координат будет влиять на значения этих векторов).

[Заменить "point" в DateTime и "vector" с помощью TimeSpan в приведенном выше аргументе.]

Я думаю, что существует настоящая разница между абсолютными и относительными значениями. Я не знаю, почему эта разница не более очевидна в арифметике, то есть почему "числа" используются, по-видимому, взаимозаменяемо, чтобы представлять как абсолютные, так и относительные значения.

Ответ 2

Дата не ведет себя как целое число, я не могу вспомнить классификацию алгебры, но рассмотрю следующее:

Date + Span = Date
Date - Date = Span  
Date + Date = undefined

Span + Span = Span
Span - Span = Span

В течение любого данного года

10 feb + 10 days = 20 feb
20 feb - 20 jan  = 31 days
20 jan + 20 feb  = ???

Это последнее вычисление может быть истолковано как имеющее смысл, когда мы рассматриваем дату как Days-from-StartDate. Но значение было бы столь же произвольным, как выбор StartDate.

Ответ 3

(Говоря как математик) Это потому, что арифметические операции над "датой" не закрыты или четко определены, что требует необходимости в дополнительной структуре.

Например, 1 января 2000 г. - 1 декабря 1999 г. =...? Мы знаем там 31 день между ними, но если это было истолковано как дата, тогда ответ будет эпохой (т.е. Ноль) + 31 день. Это уже не действительная "дата".

Аналогично, все арифметические операции с целыми числами не определены корректно (1/2 не имеет ответа в целых числах. целочисленная математика возвращает здесь нуль, но 0 * 2 = 0, а не 1, как и следовало ожидать). Это требует необходимости в дополнительной структуре, которую мы называем фракциями.

Ответ 4

Просто потому, что вы можете определить операцию, это не значит, что вы должны. Например, одной из причин деления на ноль является undefined, так как определение этого требует пожертвования некоторыми очень полезными свойствами арифметики (например, ассоциативность и т.д.).

Различие между периодом времени и датой сводится к добавлению. Имеет смысл добавить два раза, но не имеет смысла добавлять две даты, если у вас нет произвольной контрольной даты. Не позволяя добавлять даты, вы абстрагируетесь от этой произвольной контрольной даты. Я не знаю, какая дата "0" находится в .Net, и мне никогда не нужно было знать. Разве это не приятно?

Добавление двух дат почти всегда является ошибкой (серьезно, постарайтесь придумать, где это имеет смысл за пределами нумерологии). Внедряя временные рамки (создавая Affine Space), вы удаляете целый класс ошибок.

Ответ 5

Одна из причин заключается в том, что разделение типов предотвращает класс ошибок, когда вы думаете, что у вас есть относительное время, но на самом деле есть абсолютное время, и наоборот. Например, добавление двух абсолютных времен может быть помечено как ошибка компилятора, если эти два типа являются отдельными.

Кроме того, IntelliSense (и обнаружение для новичков) работает лучше, когда число членов меньше - путем разделения методов между двумя типами, работа с каждым становится проще.

Ответ 6

Отвечая на вопрос наоборот: что бы облегчить ослабление системы типов в этом отношении?

Все его вопрос о стоимости и выгоде и DateTime имеет большую выгоду от уменьшения ошибок из-за нелогичных вычислений даты/времени, запрещая такие действия. DateTime существует по тем же причинам, что и в первую очередь существует строгая система проверки типов: чтобы семантические ошибки в коде генерировали сообщения времени компиляции. которые уведомляют программистов об ошибках в их коде.

И наоборот, стоимость DateTime: zilch.

Теперь рассмотрим dropping DateTime. Что мы получим?

Чтобы ответить на ваш вопрос напрямую: "не является ли TimeSpan избыточным?" Абсолютно нет, это уменьшает количество ошибок. Для меня это определенно.

Ответ 7

Подумайте об этом концептуально. Если я скажу вам, что у меня вечеринка через 7 дней, это "7 дней" в этом предложении дата. Могу ли я просто сказать, что моя вечеринка на 7 дней? Конечно, нет, потому что 7 дней - это не дата. Одной из ключевых идей объектно-ориентированного программирования является представление таких концепций в системе как типы. Это правда, что мы могли бы представлять все как целое (и на самом деле, многие люди имеют и делают), но в объектно-ориентированном программировании мы имеем понятие типов предметов, их поведения и свойств, и в этом смысле оно делает смысл иметь объект, который выражает это.

Ответ 8

Я думаю, вы могли бы сделать противоположный аргумент, что DateTime является избыточным, и мы должны иметь только TimeSpan:)

Серьезно, все даты действительно являются временными промежутками. Все они относятся к некоторой отправной точке. Технически, в христианском календаре нет "нулевого года" (поскольку у вас не может быть "нулевого года нашего лорда" ), но если мы назначим 12:00 А.М. 1 января 0001 г. Б.С. как "нулевая точка", то каждую дату, которая приходит после (или раньше), можно рассматривать как относительно этой даты. Итак, 12:00 А.М. 19 сентября 2009 года был бы TimeSpan в 734033 дней.

Итак, математически, DateTime и TimeSpan являются избыточными. Но когда мы пишем код, мы пытаемся общаться гораздо больше, чем просто абстрактные математические конструкции. Любой данный экземпляр DateTime может фактически быть временным интервалом относительно некоторой произвольной нулевой точки, но для большинства людей, читающих ваш код, это будет означать конкретный момент в календаре. Аналогично, a TimeSpan подразумевает разрыв между двумя точками в календаре.

В этом случае Microsoft предпочла быть понятной, а не скупой. Я не могу сказать, что не согласен с этим решением.

Ответ 9

В датах есть много осложнений, например:

  • високосные годы
  • секунды прыжка
  • изменение 1582 в gregorian calendar
  • тот факт, что нет такой вещи, как 0 лет
  • различия в длинах месяцев

Обработка дат и временных интервалов в качестве разных вещей означает, что эти проблемы гораздо менее сбивают вас с толку на практике.

Ответ 10

его сахар не более или менее....