/// <summary> /// Use the Initialize method with the gmtOffset parameter /// to create a list of timezones which have a specific /// offset value. For example, for all timezones at /// GMT-5:00, pass -300 (minutes). To get all of the time /// zones known to the OS, pass ALL_TIMEZONES_LIST or call /// the method with no parameters. /// </summary> /// <param name="gmtOffset">Offset of the target timezones /// from GMT (in minutes).</param> public void Initialize( int gmtOffset ) { TimeZoneInformation mTimeZoneInformation = new OpenNETCF.Win32.TimeZoneInformation(); // On Windows CE 3.0 other than Pocket PC, we can scan // the registry for a list of timezones. // HKLM\Time Zones is the root. Under this root are all // of the timezone entries that the system knows about. // The name of each key for a timezone entry is the // 'standard time' description for the timezone (Eastern // Standard Time, for example). Under this key are various // values: // Display - The name of the timezone for display purposes. // This value includes the offset from GMT, as well as the // name, in some form, of the timezone. // Dlt - The name of the timezone for the 'daylight time' // part of the year (Eastern Daylight Time, for example). // TZI - A binary structure, like TIME_ZONE_INFORMATION, // describing the characteristics of the timezone. // Scan through the registry, looking for the indicated // timezone offset from GMT in the display string. When // we find it, we add it to a list, since there might // be several matches (Arizona and normal MST would both // match GMT-7, for example). if (!System.IO.File.Exists("\\windows\\citydb.dll"))//OpenNETCF.EnvironmentEx.PlatformName.IndexOf("Pocket")==-1) { RegistryKey baseKey; baseKey = Registry.LocalMachine.OpenSubKey("Time Zones", false); if ( baseKey != null ) { // Enumerate all keys under the base timezone key. //string cls; string[] subkeynames = baseKey.GetSubKeyNames(); foreach(string thiskeyname in subkeynames) { // Open the enumerated key. RegistryKey tzKey = baseKey.OpenSubKey(thiskeyname, false); if ( tzKey != null ) { // Get the display name value for the timezone. string dispName; dispName = tzKey.GetValue("Display").ToString(); if(dispName != null) { // Extract the offset from GMT from the display string. // The basic format of the string is: // (GMT-%02d:%02d) <Name> // The problem is when you are *at* GMT, where the sign // and the numbers aren't present. int hoursOffset = 999, minutesOffset = 999; string hours; string minutes; hours = dispName.Substring( 4, 3 ); minutes = dispName.Substring( 8, 2 ); // For the case of GMT itself, there is no // offset in the display name, so we // set the offset to zero, in that case. if ( ( hours[ 0 ] == '-' ) || ( hours[ 0 ] == '+' ) ) { hoursOffset = System.Int32.Parse( hours ); minutesOffset = System.Int32.Parse( minutes ); } else { hoursOffset = 0; minutesOffset = 0; } // Compute the timezone's total offset in minutes int offset = hoursOffset * 60; if ( hoursOffset < 0 ) { offset -= minutesOffset; } else { offset += minutesOffset; } // We now have a value which we can compare to the // value that the user gave us. if ( ( gmtOffset == offset ) || ( gmtOffset == ALL_TIMEZONES_LIST ) ) { // Match. Add timezone to list. So far, we have // the standard time name and the display name. // We still need to get the DST name and the // TIME_ZONE_INFORMATION. string dstName; dstName = tzKey.GetValue("Dlt").ToString(); // Read the time zone information from the // registry. Unfortunately, this is something // that only the Control Panel code actually // knows about, so, if they change it, we break. TZREG tzr = new TZREG(); int tzrSize = tzr.ToByteArray().Length; TimeZoneInformation tzi = new TimeZoneInformation(); byte[] btzr; btzr = (byte[])tzKey.GetValue("TZI"); tzr = new TZREG( btzr ); tzi.Bias = tzr.Bias; tzi.StandardBias = tzr.StandardBias; tzi.DaylightBias = tzr.DaylightBias; tzi.StandardDate = tzr.StandardDate; tzi.DaylightDate = tzr.DaylightDate; // Don't forget to copy the standard name and // daylight name to the structure. tzi.DaylightName = dstName; tzi.StandardName = thiskeyname; // Copy the display name from the registry to // the class. tzi.DisplayName = dispName; this.Add( tzi ); } }//endif dispname null // close the timezone key. tzKey.Close(); }//endif tzkey null }//end foreach subkeynames // Close the key. baseKey.Close(); } } else { //Pocket PC InitCityDb(); ClockLoadAllTimeZoneData(); int nZones = ClockGetNumTimezones(); //tzData = new TZData[nZones]; for( int i = 0; i < nZones; i++ ) { IntPtr p = ClockGetTimeZoneDataByOffset(i); TZData tmp= new TZData(p); if ( ( gmtOffset == tmp.GMTOffset ) || ( gmtOffset == ALL_TIMEZONES_LIST ) ) { TimeZoneInformation tzi = new TimeZoneInformation(); tzi.Bias = tmp.GMTOffset; tzi.DaylightBias =tmp.DSTOffset; // tzi.StandardDate = tzr.StandardDate; // tzi.DaylightDate = tzr.DaylightDate; // Don't forget to copy the standard name and // daylight name to the structure. tzi.DaylightName = tmp.DSTName; tzi.StandardName = tmp.Name; // Copy the display name from the registry to // the class. tzi.DisplayName = tmp.ShortName; this.Add(tzi); } } ClockFreeAllTimeZoneData(); UninitCityDb(); } }
/// <summary> /// Use the Initialize method with the gmtOffset parameter /// to create a list of timezones which have a specific /// offset value. For example, for all timezones at /// GMT-5:00, pass -300 (minutes). To get all of the time /// zones known to the OS, pass ALL_TIMEZONES_LIST or call /// the method with no parameters. /// </summary> /// <param name="gmtOffset">Offset of the target timezones /// from GMT (in minutes).</param> public void Initialize(int gmtOffset) { TimeZoneInformation mTimeZoneInformation = new OpenNETCF.Win32.TimeZoneInformation(); // On Windows CE 3.0 other than Pocket PC, we can scan // the registry for a list of timezones. // HKLM\Time Zones is the root. Under this root are all // of the timezone entries that the system knows about. // The name of each key for a timezone entry is the // 'standard time' description for the timezone (Eastern // Standard Time, for example). Under this key are various // values: // Display - The name of the timezone for display purposes. // This value includes the offset from GMT, as well as the // name, in some form, of the timezone. // Dlt - The name of the timezone for the 'daylight time' // part of the year (Eastern Daylight Time, for example). // TZI - A binary structure, like TIME_ZONE_INFORMATION, // describing the characteristics of the timezone. // Scan through the registry, looking for the indicated // timezone offset from GMT in the display string. When // we find it, we add it to a list, since there might // be several matches (Arizona and normal MST would both // match GMT-7, for example). if (!System.IO.File.Exists("\\windows\\citydb.dll")) //OpenNETCF.EnvironmentEx.PlatformName.IndexOf("Pocket")==-1) { RegistryKey baseKey; baseKey = Registry.LocalMachine.OpenSubKey("Time Zones", false); if (baseKey != null) { // Enumerate all keys under the base timezone key. //string cls; string[] subkeynames = baseKey.GetSubKeyNames(); foreach (string thiskeyname in subkeynames) { // Open the enumerated key. RegistryKey tzKey = baseKey.OpenSubKey(thiskeyname, false); if (tzKey != null) { // Get the display name value for the timezone. string dispName; dispName = tzKey.GetValue("Display").ToString(); if (dispName != null) { // Extract the offset from GMT from the display string. // The basic format of the string is: // (GMT-%02d:%02d) <Name> // The problem is when you are *at* GMT, where the sign // and the numbers aren't present. int hoursOffset = 999, minutesOffset = 999; string hours; string minutes; hours = dispName.Substring(4, 3); minutes = dispName.Substring(8, 2); // For the case of GMT itself, there is no // offset in the display name, so we // set the offset to zero, in that case. if ((hours[0] == '-') || (hours[0] == '+')) { hoursOffset = System.Int32.Parse(hours); minutesOffset = System.Int32.Parse(minutes); } else { hoursOffset = 0; minutesOffset = 0; } // Compute the timezone's total offset in minutes int offset = hoursOffset * 60; if (hoursOffset < 0) { offset -= minutesOffset; } else { offset += minutesOffset; } // We now have a value which we can compare to the // value that the user gave us. if ((gmtOffset == offset) || (gmtOffset == ALL_TIMEZONES_LIST)) { // Match. Add timezone to list. So far, we have // the standard time name and the display name. // We still need to get the DST name and the // TIME_ZONE_INFORMATION. string dstName; dstName = tzKey.GetValue("Dlt").ToString(); // Read the time zone information from the // registry. Unfortunately, this is something // that only the Control Panel code actually // knows about, so, if they change it, we break. TZREG tzr = new TZREG(); int tzrSize = tzr.ToByteArray().Length; TimeZoneInformation tzi = new TimeZoneInformation(); byte[] btzr; btzr = (byte[])tzKey.GetValue("TZI"); tzr = new TZREG(btzr); tzi.Bias = tzr.Bias; tzi.StandardBias = tzr.StandardBias; tzi.DaylightBias = tzr.DaylightBias; tzi.StandardDate = tzr.StandardDate; tzi.DaylightDate = tzr.DaylightDate; // Don't forget to copy the standard name and // daylight name to the structure. tzi.DaylightName = dstName; tzi.StandardName = thiskeyname; // Copy the display name from the registry to // the class. tzi.DisplayName = dispName; this.Add(tzi); } } //endif dispname null // close the timezone key. tzKey.Close(); } //endif tzkey null } //end foreach subkeynames // Close the key. baseKey.Close(); } } else { //Pocket PC InitCityDb(); ClockLoadAllTimeZoneData(); int nZones = ClockGetNumTimezones(); //tzData = new TZData[nZones]; for (int i = 0; i < nZones; i++) { IntPtr p = ClockGetTimeZoneDataByOffset(i); TZData tmp = new TZData(p); if ((gmtOffset == tmp.GMTOffset) || (gmtOffset == ALL_TIMEZONES_LIST)) { TimeZoneInformation tzi = new TimeZoneInformation(); tzi.Bias = tmp.GMTOffset; tzi.DaylightBias = tmp.DSTOffset; // tzi.StandardDate = tzr.StandardDate; // tzi.DaylightDate = tzr.DaylightDate; // Don't forget to copy the standard name and // daylight name to the structure. tzi.DaylightName = tmp.DSTName; tzi.StandardName = tmp.Name; // Copy the display name from the registry to // the class. tzi.DisplayName = tmp.ShortName; this.Add(tzi); } } ClockFreeAllTimeZoneData(); UninitCityDb(); } }