Это может показаться немного не по теме, но это был пост, с которым я столкнулся, задаваясь вопросом, что происходит, когда вы читаете столбец как dateTime в c #. Эта публикация отражает информацию, которую мне хотелось бы узнать об этом механизме. Если вы беспокоитесь о UTC и часовых поясах, тогда читайте на
Я провел немного больше исследований, так как всегда очень настороженно отношусь к DateTime как к классу из-за его автоматических предположений о том, какой часовой пояс вы используете, и потому что слишком легко спутать местное время и время utc.
Чего я пытаюсь избежать, так это того, что DateTime работает 'О, посмотрите, компьютер, на котором я работаю, находится в часовом поясе x, поэтому это время также должно быть в часовом поясе x, когда меня спрашивают мои значения Я отвечу так, как будто я нахожусь в этом часовом поясе '
Я пытался прочитать столбец datetime2
.
Дата, когда вы вернетесь с сервера sql, в конечном итоге будет Kind.Unspecified
Это, кажется, означает, что к нему относятся как к UTC, что я и хотел.
При чтении столбца date
вы также должны читать его как DateTime
, даже если он не имеет времени и еще более подвержен ошибкам часовых поясов (как в полночь).
Я бы, конечно, посчитал, что это более безопасный способ чтения DateTime, так как я подозреваю, что он может быть изменен либо настройками на сервере sql, либо статическими настройками в вашем c #:
var time = reader.GetDateTime(1);
var utcTime = new DateTime(time.Ticks, DateTimeKind.Utc);
Оттуда вы можете получить компоненты (день, месяц, год) и т. Д. И отформатировать, как вам нравится.
Если то, что у вас есть, на самом деле является датой + временем, тогда Utc может быть не тем, что вы хотите - поскольку вы осматриваете клиента, вам может понадобиться сначала преобразовать его в местное время (в зависимости от значения время). Однако это открывает целую банку с червями. Если вам нужно сделать это, я бы порекомендовал использовать такую библиотеку, как noda time . В стандартной библиотеке есть TimeZoneInfo
, но после краткого исследования она, кажется, не имеет правильного набора часовых поясов . Вы можете просмотреть список, предоставленный TimeZoneInfo
, используя метод TimeZoneInfo.GetSystemTimeZones();
Я также обнаружил, что студия управления серверами sql не конвертирует время в местное время перед отображением. Что является облегчением!