Какая наилучшая практика для представления объекта Time в С#?

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

Ответы

Ответ 1

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

Ответ 2

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

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

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

  • И, наконец, время дня включает в себя любую концепцию летнего времени, которая может применяться к часовому поясу, в котором он был взят. Поэтому вы не можете думать об этом как о "прошедшем времени с полуночи".

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

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

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

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

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

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

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

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

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

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

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

Ответ 3

Джон Скит работал над чем-то, называемым Noda Time, возможно, это поможет.

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

Ответ 4

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

TimeSpan ts = DateTime.Now.TimeOfDay

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

Ответ 5

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

Ответ 6

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

Ответ 7

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