I want to set the windows timezone.
First I read the regitry to get all timezone info. Here is the code:
public static void GetTimeZones()
{
//open key where all time zones are located in the registry
RegistryKey timeZoneKeys = Registry.LocalMachine.OpenSubKey("Software\\Microsoft\\Windows NT\\CurrentVersion\\Time Zones");
//iterate through each time zone in the registry and add it to the hash table
foreach (string zonekey in timeZoneKeys.GetSubKeyNames())
{
//get current time zone key
RegistryKey individualZone = timeZoneKeys.OpenSubKey(zonekey);
//create new TZI struct and populate it with values from key
TimeZoneInformation TZI = new TimeZoneInformation();
TZI.standardName = individualZone.GetValue("Std").ToString();
TZI.daylightName = individualZone.GetValue("Dlt").ToString();
//read binary TZI data, convert to byte array
byte[] byTZI = (byte[])individualZone.GetValue("TZI");
REG_TIME_ZONE_INFORMATION reg_TZI;
GCHandle h = GCHandle.Alloc(byTZI, GCHandleType.Pinned);
try
{
reg_TZI = (REG_TIME_ZONE_INFORMATION)Marshal.PtrToStructure(h.AddrOfPinnedObject(),typeof(REG_TIME_ZONE_INFORMATION));
TZI.bias = reg_TZI.nBias;
TZI.standardBias = reg_TZI.nStandardBias;
TZI.daylightBias = reg_TZI.nDaylightBias;
TZI.standardDate.wYear = reg_TZI.dtStandardDate.wYear;
TZI.standardDate.wMonth = reg_TZI.dtStandardDate.wMonth;
TZI.standardDate.wDayOfWeek = reg_TZI.dtStandardDate.wDayOfWeek;
TZI.standardDate.wDay = reg_TZI.dtStandardDate.wDay;
TZI.standardDate.wHour = reg_TZI.dtStandardDate.wHour;
TZI.standardDate.wMinute = reg_TZI.dtStandardDate.wMinute;
TZI.standardDate.wSecond = reg_TZI.dtStandardDate.wSecond;
TZI.standardDate.wMilliseconds = reg_TZI.dtStandardDate.wMilliseconds;
TZI.daylightDate.wYear = reg_TZI.dtDaylightDate.wYear;
TZI.daylightDate.wMonth = reg_TZI.dtDaylightDate.wMonth;
TZI.daylightDate.wDayOfWeek = reg_TZI.dtDaylightDate.wDayOfWeek;
TZI.daylightDate.wDay = reg_TZI.dtDaylightDate.wDay;
TZI.daylightDate.wHour = reg_TZI.dtDaylightDate.wHour;
TZI.daylightDate.wMinute = reg_TZI.dtDaylightDate.wMinute;
TZI.daylightDate.wSecond = reg_TZI.dtDaylightDate.wSecond;
TZI.daylightDate.wMilliseconds = reg_TZI.dtDaylightDate.wMilliseconds;
}
catch
{ }
finally
{
h.Free();
}
//add the name and TZI struct to hash table
TimeZoneCollection.Add(TZI.standardName, TZI);
}
}
public static void Main()
{
TimeZoneTest.TimeZoneInformation tzi = new TimeZoneTest.TimeZoneInformation();
TimeZoneTest.GetTimeZones();
if (TimeZoneTest.TimeZoneCollection.ContainsKey("Mountain Standard Time"))
{
Console.WriteLine("get the Mountain time!");
tzi = (TimeZoneTest.TimeZoneInformation)TimeZoneTest.TimeZoneCollection["Mountain Standard Time"];
}
Console.WriteLine("the bias of Montain time is {0}, {1}, {2}", tzi.bias, tzi.standardBias, tzi.daylightBias);
bool result = TimeZoneTest.SetTimeZone(tzi);
}
The bias for any time zones are same, and the settimezone which calls SetTimeZoneInformation() in kernal32.dll always return false .
Any idea, many thanks