Как конвертировать часовые пояса с Win32 API? - PullRequest
5 голосов
/ 28 февраля 2009

У меня есть строки дат, такие как 2009-02-28 15:40:05 AEDST , и я хочу преобразовать их в структуру SYSTEMTIME. Пока у меня есть:

SYSTEMTIME st;
FILETIME ft;
SecureZeroMemory(&st, sizeof(st));
sscanf_s(contents, "%u-%u-%u %u:%u:%u",
    &st.wYear,
    &st.wMonth,
    &st.wDay,
    &st.wHour,
    &st.wMinute,
    &st.wSecond);
// Timezone correction
SystemTimeToFileTime(&st,  &ft);
LocalFileTimeToFileTime(&ft, &ft);
FileTimeToSystemTime(&ft, &st);

Однако мой местный часовой пояс не AEDST. Поэтому мне нужно иметь возможность указывать часовой пояс при конвертации в UTC.

Ответы [ 2 ]

7 голосов
/ 28 февраля 2009

Взгляните на это:

https://web.archive.org/web/20140205072348/http://weseetips.com:80/2008/05/28/how-to-convert-local-system-time-to-utc-or-gmt/

 // Get the local system time.
 SYSTEMTIME LocalTime = { 0 };
 GetSystemTime( &LocalTime );

 // Get the timezone info.
 TIME_ZONE_INFORMATION TimeZoneInfo;
 GetTimeZoneInformation( &TimeZoneInfo );

 // Convert local time to UTC.
 SYSTEMTIME GmtTime = { 0 };
 TzSpecificLocalTimeToSystemTime( &TimeZoneInfo,
                                  &LocalTime,
                                  &GmtTime );

 // GMT = LocalTime + TimeZoneInfo.Bias
 // TimeZoneInfo.Bias is the difference between local time
 // and GMT in minutes. 

 // Local time expressed in terms of GMT bias.
 float TimeZoneDifference = -( float(TimeZoneInfo.Bias) / 60 );
 CString csLocalTimeInGmt;
 csLocalTimeInGmt.Format( _T("%ld:%ld:%ld + %2.1f Hrs"),
                          GmtTime.wHour,
                          GmtTime.wMinute,
                          GmtTime.wSecond,
                          TimeZoneDifference );

Вопрос. Как получить TIME_TIMEZONE_INFORMATION для определенного часового пояса?

К сожалению, вы не можете сделать это с помощью Win32 API. Обратитесь к MSDN и Как получить определенную структуру TIME_ZONE_INFORMATION в Win32?

Вам нужно будет либо создать пустую переменную и заполнить ее вручную, либо использовать стандартную библиотеку времени C.

0 голосов
/ 28 февраля 2009

Вы смотрели на TzSpecificLocalTimeToSystemTime Win32 API?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...