【问题标题】:How to convert between timezones with win32 API?如何使用 win32 API 在时区之间进行转换?
【发布时间】:2009-02-28 05:29:28
【问题描述】:

我有日期字符串,例如 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 时指定时区。

【问题讨论】:

    标签: c windows winapi


    【解决方案1】:

    看看这个:

    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 做到这一点。参考MSDNHow do I get a specific TIME_ZONE_INFORMATION struct in Win32?

    您要么需要创建一个空变量并手动填充它,要么使用标准 C 时间库。

    【讨论】:

    【解决方案2】:

    你看过TzSpecificLocalTimeToSystemTime Win32 API吗?

    【讨论】:

    • 谢谢,但我如何检索不同时区(即 AEDST)的 TIME_ZONE_INFORMATION?
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2010-09-12
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多