Я понимаю, что это ответ на вопрос. Я добавляю свои несколько центов также для дальнейшего использования. Это тоже другой подход.
Мое полное решение следующим образом. Все время хранится как UTC в базе данных. Вы можете выбрать другой часовой пояс по умолчанию. Но тогда расчет усложняется. И если вы решили переместить хост в другую страну, это будет проблемой.
База данных
Во-первых, необходимо сохранить выбранный пользователем часовой пояс в некоторой таблице, которая содержит информацию о пользователе. В основном мы собираемся хранить TimeZoneInfo.Id (строковое значение). Это легко снова создать класс TimeZoneInfo.
Далее создайте пользовательскую функцию и установите return как datetime. Это будет использоваться во всей БД везде, где вам нужно время сервера. Код, как показано,
Create FUNCTION [dbo].[fnGetDateTime] ()
RETURNS datetime
AS
BEGIN
RETURN GETUTCDATE()
END
Это вернет время UTC. Мы можем использовать метод GETUTCDATE () сразу везде в БД. Но использование UDF дает гибкость в обслуживании.
Код
мы можем использовать расширяемость метода в Date-time Class. Поскольку это решение основано на asp.net, вычислить время сложно. Проблема в том, что здесь участвуют 3 стороны. БД Сервер, Веб-сервер и Пользователь. Каждый может быть в разных часовых поясах. Но нам нужно только ретранслировать выбранный пользователем часовой пояс и время UTC.
Я расширил DateTime Strucute двумя дополнительными методами.
Namespace Extensions
Public Module ModDateTimeExtensions
<System.Runtime.CompilerServices.Extension()> _
Public Function GetUserTimeFromUTC(ByVal dtUtcTime As DateTime, ByVal id As String) As DateTime
Return TimeZoneInfo.ConvertTimeFromUtc(dtUtcTime, TimeZoneInfo.FindSystemTimeZoneById(id))
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function SetUserTimeToUTC(ByVal dtUserTime As DateTime, ByVal id As String) As DateTime
Return TimeZoneInfo.ConvertTime(dtUserTime, TimeZoneInfo.FindSystemTimeZoneById(id), TimeZoneInfo.Utc)
End Function
End Module
End Namespace
Здесь важная вещь, которую не следует ретранслировать на часовой пояс веб-сервера для расчета.
Тогда в основном вы можете сделать преобразование, как показано ниже. Предполагая, что пользовательский часовой пояс установлен на «Тихоокеанское стандартное время». Это нужно извлечь из БД при входе пользователя в систему.
Dim dt as DateTime = FunctionToGetUTCTimeFromDB()
dt = dt.GetUserTimeFromUTC("Pacific Standard Time")
Если вы хотите сэкономить время пользователя в UTC, позвоните по номеру
Dim dt as DateTime = GetUserSelectedTimeFromUI()
dt = dt.SetUserTimeToUTC("Pacific Standard Time")
Это дает следующую гибкость,
Меньше кодирования и меньше изменений, если это необходимо реализовать в существующей системе.
Простота обслуживания.
В будущем, если вы захотите внедрить формат даты и времени, выбираемый пользователем, можете сделать то же самое с небольшими изменениями.