Как правило, вы не должны полагаться на местный часовой пояс сервера.Это общесистемный параметр, который можно легко изменить без прав администратора.Это делает вас уязвимым для трудных для отслеживания производственных ошибок, таких как один сервер в кластере с настройкой часового пояса, отличной от другой.Это также создает проблему, если когда-либо перемещать сервер в другое место (или в облако) и это затрагивает ваши данные.
Также очень часто серверы намеренно устанавливают для своих часовых поясов UTC, чтобына их файлы журналов не влияют такие вещи, как переходы на летнее время.
Если независимо от того, что вы все еще хотите утверждать, что значение DateTime
отражает местный часовой пояс компьютера, вы сделаете это, обеспечив DateTimeKind.Local
устанавливается в свойстве .Kind
.Это может быть сделано в параметре конструктора, или с DateTimeStyles.AssumeLocal
при разборе, или с DateTime.SpecifyKind
для существующего значения.Затем вы можете использовать .ToUniversalTime()
для преобразования в UTC перед отправкой его конечному пользователю.
Однако я настоятельно рекомендую вам использовать DateTimeOffset
.В отличие от DateTime
, он будет сохранять смещение и учитывать его для большинства операций.Если вы создадите DateTimeOffset
из DateTime
с DateTimeKind.Unspecified
, по умолчанию будет использоваться местный часовой пояс.Точно так же, если вы создаете его с помощью синтаксического анализа (DateTimeOffset.Parse
, .TryParse
, .ParseExact
, .TryParseExact
и т. Д.), Если во входной строке нет смещения, по умолчанию также будет использоваться местный часовой пояс.
ОДНАКО - ни один из этих объектов фактически не будет отслеживать часовой пояс таким образом, чтобы должным образом учитывать переходы (например, когда летнее время перемещает тихоокеанское время между PST и PDT и наоборот),Если это то, что вы ищете - извините, вам не повезло со встроенными типами.Вместо этого вам нужно будет использовать класс ZonedDateTime
из библиотеки с открытым исходным кодом Noda Time .
Также вы указали:
...Этот текст данных будет использоваться через JavaScript для изменения даты на местное время пользователя.
Это не невозможно, но довольно сложно получить JavaScript для преобразования даты и времени в локальное время пользователячасовой пояс, если у вас также нет смещения.Сериализация значения DateTimeOffset
обратно в браузер даст вам это для отображения, но если вы попросите пользователя изменить значение, вам придется каким-то образом преобразовать его обратно.
Все намного проще, если вы просто передаете значения UTC между браузером и сервером.Тогда вы можете просто конвертировать UTC в местное время и наоборот в браузере.(По крайней мере, для значений даты и времени. Не пытайтесь преобразовывать значения только для даты.)