Ответ 1
Я делал это раньше, сохраняя идентификатор часового пояса в базе данных, используя таблицу сопоставления. т.е. таблица, содержащая результаты TimeZone.GetSystemTimeZones()
Фактически вам не нужно использовать TimeZoneInfo.FindSystemTimeZoneById()
: вы можете выполнить преобразование, используя одну из перегрузок TimeZoneInfo.ConvertTimeBySystemTimeZoneId()
. Этот метод имеет некоторые перегрузки, которые принимают значения DateTime, и некоторые, которые принимают значения DateTimeOffset (что предпочтительнее, поскольку они указывают однозначный момент времени).
например.
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(DateTime.Now, "New Zealand Standard Time", "UTC")
Реальная польза от использования идентификатора часового пояса системы, а не смещения, хранящегося в базе данных, заключается в том, что переход на летнее время автоматически выполняется для вас с помощью TimeZoneInfo.ConvertTimeBySystemTimeZoneId
.