Как лучше всего представлять объект Time в C #? - PullRequest
15 голосов
/ 11 сентября 2010

У меня есть столбец Time в таблице базы данных. Дата не важна, мы просто хотим время в день. Какой тип будет лучше всего представлять его в C #? Я собирался использовать DateTime, но мне не нравится идея иметь дату.

Ответы [ 7 ]

26 голосов
/ 06 сентября 2013

В то время как другие ответы в основном верны, что TimeSpan - единственный встроенный тип, который будет работать, важно понимать, что между «истекшим измерением времени» и «временем дня» есть четкие различия.

  • Наиболее очевидная разница в том, что время суток должно быть меньше 24 часов.TimeSpan объект может охватывать гораздо больше.

  • Другое отличие состоит в том, что тип TimeSpan может быть отрицательным .Это представляет движение назад во времени.Отрицательное значение будет бессмысленным как время суток.

  • И, наконец, время суток включает любую концепцию перехода на летнее время, которая может применяться к часовому поясу вкоторый был взят.Таким образом, вы не можете думать об этом как о «прошедшем времени с полуночи».

    • Если это день перехода на летнее время DST (в США), тогда значение 4:00 имеетс полуночи прошло только 3 часа.
    • Если это день запасного перехода DST (в США), то значение 4:00 фактически прошло 5 часов с полуночи.
    • И поскольку летнее время во всем мире различается, вполне возможно, что полночь даже не существует или существует дважды.Это происходит в таких местах, как Бразилия и др.

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

Даже.NET Framework сам делает этот компромисс.Например:

  • Класс DateTime имеет свойство TimeOfDay, которое возвращает TimeSpan.
  • Если у вас есть тип time в SQL Server, он будетTimeSpan при возврате через .NET SQL Client.

Справочная документация MSDN говорит о типе TimeSpan:

Структура TimeSpan также может использоваться для представления времени суток, но только в том случае, если время не связано с конкретной датой.В противном случае вместо этого следует использовать структуру DateTime или DateTimeOffset.

Это, в принципе, еще один способ сказать то, что я рассмотрел в своем третьем пункте выше о летнем времени.

Однако, если выне заинтересованы в компромиссе в своем дизайне и хотели бы использовать тип реального времени суток, а затем взгляните на библиотеку Noda Time .

  • Есть LocalTime тип, который представляет время суток. Это прямой ответ на вопрос, который был задан.
  • Существует тип Duration, представляющий прошедшую меру времени.
  • Существует такжеPeriod тип, представляющий позиционное движение в календаре - это то, что TimeSpan не может сделать.Например, «3 года и 5 месяцев» будет значением Period.
  • Существует также тип Offset, который похож на Duration, но используется как смещение от UTCдля часовых поясов.Диапазон действия ограничен этой целью.

Хотя некоторые могут сказать, что TimeSpan более универсален, поскольку он может справиться со всеми из них, правда в том, что он позволяет вам попадать в неприятности.Разделяя типы, вы получаете безопасность и согласованность.

В качестве альтернативы вы можете рассмотреть пакет System.Time, доступный от Microsoft, как часть CoreFX Lab .Этот пакет содержит реализации типа только для времени с именем Time и типа только для даты с именем Date.Вам нужно будет использовать ленту dotnet-corefxlab MyGet для импорта этого пакета.

15 голосов
/ 11 сентября 2010

Вы можете использовать структуру TimeSpan для представления времени в .NET.

4 голосов
/ 11 сентября 2010

Джон Скит работает над чем-то, что называется Время Ноды , возможно, это поможет.

Пост Скита о том, почему он может быть правильным для вас: Что не так с DateTime?

2 голосов
/ 11 сентября 2010

Вы можете попробовать что-то вроде этого

TimeSpan ts = DateTime.Now.TimeOfDay

Где вы применяете свойство времени объекта DateTime и просто используете его.

1 голос
/ 11 сентября 2010

Я бы использовал TimeSpan , чтобы представить это, с TimeSpan как промежуток времени с полуночи.Это соответствует свойству DateTime TimeOfDay в рамках.

1 голос
/ 11 сентября 2010

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

0 голосов
/ 25 апреля 2014

Мы на самом деле катили наш собственный класс Time. Проблема, с которой мы столкнулись, заключается в том, что TimeSpan не знает о смещениях часовых поясов, которые нам все еще нужны. Итак, мы создали класс TimeSpanOffset. Вид аналогичный классу DateTimeOffset. Если часовой пояс не важен, я бы точно придерживался TimeSpan.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...