Ответ 1
Вы можете использовать структуру TimeSpan для представления времени в .NET.
У меня есть столбец "Время" в таблице базы данных. Дата не важна, нам просто нужно время в день. Какой тип лучше всего представлять на С#? Я собирался использовать DateTime, но мне не нравится идея иметь дату.
Вы можете использовать структуру TimeSpan для представления времени в .NET.
В то время как другие ответы в основном правильны, что TimeSpan
является единственным встроенным типом, который будет работать, важно понять, что существуют разные различия между "прошедшим измерением времени" и "временем суток".
Самое очевидное различие заключается в том, что время суток должно быть меньше 24 часов. Объект TimeSpan
может охватывать гораздо больше.
Другое отличие состоит в том, что тип TimeSpan
может быть отрицательным. Это означает перемещение назад во времени. Отрицательное значение было бы бессмысленным как время суток.
И, наконец, время дня включает в себя любую концепцию летнего времени, которая может применяться к часовому поясу, в котором он был взят. Поэтому вы не можете думать об этом как о "прошедшем времени с полуночи".
4:00
истекает через 3 часа с полуночи.4:00
фактически прошло через 5 часов с полуночи. Поэтому, если вы используете 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
.
Сообщение о том, почему это может быть правильно для вас: Что не так с DateTime?
Вы можете попробовать что-то вроде этого
TimeSpan ts = DateTime.Now.TimeOfDay
Если вы применяете свойство time объекта DateTime и просто используете его.
Используйте временную рамку для представления промежутка времени от полуночи до времени.
Я бы использовал TimeSpan, чтобы представить это, когда TimeSpan является промежутком времени с полуночи. Это соотносится с атрибутом DateTime TimeOfDay в рамках.
Мы фактически перевернули собственный класс времени. Проблема, с которой мы столкнулись, заключается в том, что TimeSpan не знает о смещениях часовых поясов, которые нам все еще нужны. Итак, мы создали класс TimeSpanOffset. Вид аналогичен классу DateTimeOffset. Если часовой пояс не важен, я бы определенно придерживался TimeSpan.