2009-02-28 31 views
5

Tôi có các chuỗi ngày như 2009-02-28 15:40:05 AEDST và muốn chuyển đổi nó thành cấu trúc SYSTEMTIME. Cho đến nay tôi có:Làm thế nào để chuyển đổi giữa các múi giờ với API win32?

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); 

Tuy nhiên múi giờ địa phương của tôi không phải là AEDST. Vì vậy, tôi cần phải có thể chỉ định múi giờ khi chuyển đổi sang UTC.

Trả lời

7

Hãy xem này:

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); 

Câu hỏi: Làm thế nào để bạn có được những TIME_TIMEZONE_INFORMATION cho một múi giờ cụ thể?

Rất tiếc, bạn không thể làm điều đó với API win32. Tham khảo MSDNHow do I get a specific TIME_ZONE_INFORMATION struct in Win32?

Bạn sẽ cần phải tạo biến trống và điền vào biến theo cách thủ công hoặc sử dụng thư viện thời gian chuẩn C.

+0

Thật không may là bạn không thể làm điều đó với API win32 ... xem http://msdn.microsoft.com/en-us/library/ms725481(VS.85).aspx Bạn sẽ cần phải tạo biến trống và điền nó theo cách thủ công hoặc sử dụng thư viện thời gian C chuẩn. – uzbones

+0

Cũng thấy http://stackoverflow.com/questions/466071/how-do-i-get-a-specific-timezoneinformation-struct-in-win32 – uzbones

+0

điều này cũng yêu cầu XP hoặc cao hơn. TzSpecificLocalTimeToSystemTime không hoạt động trên Win2k – Tim

0

Bạn đã xem API TzSpecificLocalTimeToSystemTime Win32 chưa?

+2

Cảm ơn điều đó, nhưng làm cách nào để truy xuất TIME_ZONE_INFORMATION cho múi giờ khác (ví dụ: AEDST)? – grom

Các vấn đề liên quan