В MS-Windows для Win7 и Server2008 / R2 доступны некоторые новые (но еще не завершенные) методы. См. KB 2731771. Также см. ICU и Boost :: locale.
Подпрограммы Windows (GetTimeZoneInformationForYear) требуют, чтобы вы конвертировали UTC до минимума за год. К счастью, около 1 января часовые пояса не сдвигаются, как мне известно. Вы можете использовать SystemTimeToTzSpecificLocalTime (Ex), чтобы правильно преобразовать местное время в часовой пояс, который отличается от часового пояса локальной системы.
Без этих методов вам нужно сканировать реестр, чтобы загрузить правильную информацию о часовом поясе и динамическую информацию, а затем вызвать SystemTimeToTzSpecificLocalTime.
Будьте осторожны при использовании таких вещей, как _tzset и localtime, поскольку некоторые системы (например, Windows) предполагают, что многие (в основном неправильные) вещи, такие как использование правил DST США, даже если ваши настройки TZ для Австралии.
Можно подумать, что как в Windows, так и в Linux есть довольно стандартный способ сделать что-то вроде UTCtoLocal (const char * tzName, time_t inTime, struct tm * outTime) с учетом всех динамических / исторических правил DST для часового пояса. дано. tzName должно иметь возможность использовать подходящее имя, например «Центральное стандартное время» или «Америка / Чикаго», в зависимости от того, на какой системе вы работаете. Я бы даже хотел позволить шаг в два вызова, как
GetTimeZoneInformation (const char * tzName, TIME_ZONE_INFORMATION * outTZInfo)
UTCtoLocal (const TIME_ZONE_INFORMATION * inTZInfo, time_t inTime, struct tm * outTime)
Вы знаете, что ОС уже делает это, когда загружает информацию о часовом поясе системы, а библиотеки выполняют локальные / UTC преобразования.