Не сохраняйте смещение UTC для пользователя - этого недостаточно, чтобы знать полную информацию о часовом поясе. Вам следует хранить их идентификатор часового пояса Олсона , например, "Europe / London". Затем вы можете отображать любое время UTC по местному времени с учетом исторических изменений, летнего времени и т. Д.
РЕДАКТИРОВАТЬ: похоже, TimeZoneInfo
идентификатор на самом деле не в обычном формате Олсона - но если есть что-то разумное, что вы можете отобразить для пользователя (по выбору), и идентификатор, который вы можете получить зону позже, это, вероятно, нормально ... у вас могут возникнуть трудности, если позже вам потребуется взаимодействие с другими системами.
Вы должны спросить пользователя о его часовом поясе (возможно, пытаясь сначала угадать его с помощью JavaScript) - у него будет больше информации, чем у вас.
Вы должны исследовать класс TimeZoneInfo , чтобы узнать больше об этом - я не могу сказать, что сам много использовал, но это путь к .NET 3.5. В частности, FindSystemTimeZoneById и GetSystemTimeZones будут важны.
В общем, часовые пояса - это боль, но, по крайней мере, TimeZoneInfo
дает гораздо больше поддержки, чем старый тип TimeZone
.