Я не уверен насчет последних изменений в ASP, но эта статья за 2006 год дает интересный ответ:
Проблема в том, что информация о часовом поясе не доступна напрямую через веб-браузер. Вы можете использовать эвристику для определения правильного часового пояса или вам придется сохранять настройки часового пояса для пользователя на основе их выбора.
Дальнейшее может не понадобиться для .Net 3.5 и его TimeZoneInfo..ConvertTime метода, но все же для полноты:
Если у вас есть настройки часового пояса, вам нужно перевести время. Вы всегда должны хранить значения даты / времени в БД в формате UTC . Это устраняет многие проблемы конверсии. Если вы храните информацию в UTC, то вам нужно только переводить из UTC в местный часовой пояс пользователя, когда вы отображаете данные для него, и вам нужно конвертировать из их часового пояса в UTC, когда вы получаете от них значения даты / времени.
Что делает это более трудным, так это тот факт, что класс TimeZone не так уж и полезен. К счастью, в версии 2.0 DateTime был обновлен для поддержки индикатора времени в UTC или нет. Вы можете преобразовать DateTime в UTC, используя метод DateTime.ToUniversalTime. К сожалению, однако, вы не можете преобразовать его обратно .
Метод ToLocalTime использует локальный часовой пояс, который при запуске на сервере использует часовой пояс сервера, а не тот, который вы хотели. Еще хуже то, что вы не можете просто создать объект TimeZone и использовать его, так как такой поддержки не существует.
Майкл Брамм создал замечательный маленький класс для возможности легко создавать и использовать часовые пояса. Я лично использую сильно измененную версию этого кода в своих собственных приложениях, и она прекрасно работает. Ниже приведены инструкции по преобразованию значения UTC из БД в часовой пояс локального пользователя.
1) Получить сохраненное значение часового пояса для пользователя
2) Создайте класс SimpleTimeZone, чтобы обернуть его (используя некоторую схему сопоставления, которая сопоставляет значение БД с базовой версией реестра Windows)
3) Используйте метод SimpleTimeZone.ToLocalTime для преобразования значения DateTime в местное время.
По соображениям производительности вам, вероятно, следует получить и инициализировать экземпляр SimpleTimeZone и кэшировать его в свойстве Items для длины запроса, чтобы вам не приходилось его создавать.
Для преобразования из местного часового пояса пользователя в UTC выполните обратное:
1) Получить сохраненное значение часового пояса от пользователя
2) Создайте класс SimpleTimeZone, чтобы обернуть его
3) Используйте метод SimpleTimeZone.ToUniversalTime для преобразования DateTime в UTC.