因為某種因素,小弟必須要在Windows Driver層級,透過EWDK或WDK的環境下取得時區差值與日光節約時間開啟與否。不過KUSER_SHARED_DATA (ntddk.h) - Windows drivers | Microsoft Learn裡面寫得不清不楚,實在很難讓人聯想到其實Time Zone ID就是GetTimeZoneInformation 函式 (timezoneapi.h) - Win32 apps | Microsoft Learn裡面的定義。小弟一開始還以為是Time Zone IDs (Compact 2013) | Microsoft Learn,想不到一點關係都沒有,白花了一點時間研究。
這就是標準的江湖一點訣,說破不值錢的例子,把一些研究結果記錄下來,以後可以少走一些冤枉路~
#include <ntddk.h>
#include <wdm.h>
#include <wdf.h>
#define TIME_ZONE_ID_UNKNOWN 0
#define TIME_ZONE_ID_STANDARD 1
#define TIME_ZONE_ID_DAYLIGHT 2
BOOLEAN IsDaylightSavingTimeEnabled()
{
// Read the time zone ID
ULONG timeZoneId = SharedUserData->TimeZoneId;
// Determine if daylight saving time is enabled
BOOLEAN isDaylightSavingTimeEnabled = (timeZoneId == (ULONG)TIME_ZONE_ID_DAYLIGHT);
return isDaylightSavingTimeEnabled;
}
LONG GetTimezoneOffset()
{
LARGE_INTEGER systemTime;
LARGE_INTEGER localTime;
// Get system time
KeQuerySystemTime(&systemTime);
// Convert to local time
ExSystemTimeToLocalTime(&systemTime, &localTime);
// Calculate the time zone offset (in minutes)
LONG timezoneOffset = (LONG)((systemTime.QuadPart - localTime.QuadPart) / 600000000);
return timezoneOffset;
}
也許可以參考這個登錄機碼設定值,是否更直觀地解決問題。
[HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\TimeZoneInformation]
"RealTimeIsUniversal"=QWORD:00000001