2009-09-19 3 views
17

EDIT 2009-Ноябрь-04Не нужен TimeSpan?

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

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

The number line

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

Имею ли я смысл?

+2

@ Хенк: Ха-ха, не притворяйся, что это не будет потрясающе. –

+0

Сколько вторников существует в течение 10 дней? – recursive

+0

@recursive: как все говорили все время, это зависит от вашей нулевой точки, которую .NET имеет в понедельник, 01 января 0001 (DateTime.MinValue), поэтому ответ будет равен 2. Но, похоже, вы пытаетесь вызывать что-то бессмысленное в моем вопросе; Поэтому я попрошу вас повторить, почти идентичный вопрос, чтобы проиллюстрировать МОЙ пункт: Сколько кратных 5 в промежутке 8? –

ответ

12

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

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

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


Редактировать:

Точка (расположение на плоскости) не является такой же, как вектор.

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

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

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

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

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

[Заменить «точку» с DateTime и «вектор» с TimeSpan в аргументе выше.]

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

+0

Достаточно честно - я полагаю, что мой основной момент должен заключаться в том, что DateTime и TimeSpan могут быть объединены, а не то, что TimeSpan следует исключить. –

+1

Я не согласен: логикой Дэна нет никакой разницы между DateTime и TimeSpan. Это разные примеры одной и той же концепции. Поэтому я считаю неправильным говорить, что один из них устарел от другого. – Joren

+0

Кроме того, целые числа имеют очевидный нуль, потому что мы произвольно определяем один. Любая система координат или индексации является относительной. – Joren

18

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

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.

+0

, но вы можете добавлять и вычитать даты с помощью подходящих методов, например someDate.AddDays (...) и т. Д., Не так ли? – Juri

+1

Juri, Да, но это DateTime + Days and Days - TimeSpan. –

+0

@Henk: Days - это 'double', а не' TimeSpan'. Было бы бессмысленно, если бы это был «TimeSpan», потому что «TimeSpan» определяет собственный масштаб. –

4

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

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

12

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

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

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

+0

Как вы говорите, 1 января 2000 года - 1 декабря 1999 года между ними 31 день. Затем ответ должен быть 31 день, и если вы хотите просто знать расстояние, то DateTime должно иметь свойство TotalDays, и вы должны иметь возможность писать (Date1 - Date2) .TotalDays. Правильно? Почему Эпоха + 31 день «недействительная дата»? –

+2

По разным причинам, мое любимое существо, что до введения григорианского календаря в 1528 году или около того длина «дня» была иной, чем сейчас. Поэтому, если у вас есть реализация DateTime, которая знает о таких вещах, (Date1 - Date2) + Date2! = Date1. (реализация .NET довольно хороша, но я не знаю, скольляет ли она календари для вас :). – Seth

+0

Сет, я думаю, что ваш комментарий действительно доходит до сути, я думаю, вы должны включить его в свой ответ. –

-1

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

+7

'DateTime' и' TimeSpan' являются внутренне представленными числами, но ни один из них не является фактическим числом. Если 'TimeSpan' является сахаром, то' int [] ',' char [] 'и' string' являются просто сахаром для 'byte []'. Так как это разбавит смысл синтаксического сахара до бессмысленного уровня, мы можем предположить, что вызов сахара «TimeSpan» незаслужен. –

+0

Хотя ответ немного точный, ответ тем не менее правильный. Голос здесь просто говорит: «Я не понимаю, что он говорит» больше, чем «это неверно». Фактически, как DateTime, так и TimeSpan не нужны, если вы поддались вычислению дат, используя «количество секунд с даты X время Y». –

+2

Можно утверждать, что * целая цель * системы типов состоит в том, чтобы добавить смысловое значение к значениям и обеспечить соблюдение правил о том, как эти значения должны использоваться. Не каждая абстракция над битами и байтами - это просто «сахар» - иначе, где бы вы закончили? Биты и байты - это просто абстракции над изменениями электрического состояния. Вся суть компьютерных языков состоит в том, чтобы рассуждать о * поведении *, а не о реализации. –

0

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

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

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

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

+0

Если у вас есть только относительное значение, TimeSpan, то как вы выражаете дату вывода, так как вам нужен момент времени, который является эпохой, которая не относится ни к чему. –

+0

@Pete, не уверен, что я понимаю ваш вопрос. Мы делаем это каждый день. Сегодня 09.09.09. Это девять месяцев, девятнадцать дней и 2009 год после 1 года до нашей эры. Абсолютная дата - это всего лишь промежуток времени. – devuxer

2

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

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

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

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

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

2

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

5

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

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

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

0

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

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

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

Смежные вопросы