В то время как другие ответы в основном верны, что 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 для импорта этого пакета.