// // TryGetTimeZone - // // Helper function for retrieving a TimeZoneInfo object by <time_zone_name>. // // This function may return null. // // assumes cachedData lock is taken // private static TimeZoneInfoResult TryGetTimeZone(ref TimeZoneInformation timeZoneInformation, bool dstDisabled, out TimeZoneInfo value, out Exception e, CachedData cachedData) { TimeZoneInfoResult result = TimeZoneInfoResult.Success; e = null; TimeZoneInfo match = null; // check the cache if (cachedData._systemTimeZones != null) { if (cachedData._systemTimeZones.TryGetValue(timeZoneInformation.TimeZoneKeyName, out match)) { if (dstDisabled && match._supportsDaylightSavingTime) { // we found a cache hit but we want a time zone without DST and this one has DST data value = CreateCustomTimeZone(match._id, match._baseUtcOffset, match._displayName, match._standardDisplayName); } else { value = new TimeZoneInfo(match._id, match._baseUtcOffset, match._displayName, match._standardDisplayName, match._daylightDisplayName, match._adjustmentRules, false); } return(result); } } // fall back to reading from the local machine // when the cache is not fully populated result = TryGetFullTimeZoneInformation(timeZoneInformation, out match, out e, timeZoneInformation.Dtzi.Bias); if (result == TimeZoneInfoResult.Success) { if (cachedData._systemTimeZones == null) { cachedData._systemTimeZones = new Dictionary <string, TimeZoneInfo>(); } cachedData._systemTimeZones.Add(timeZoneInformation.TimeZoneKeyName, match); if (dstDisabled && match._supportsDaylightSavingTime) { // we found a cache hit but we want a time zone without DST and this one has DST data value = CreateCustomTimeZone(match._id, match._baseUtcOffset, match._displayName, match._standardDisplayName); } else { value = new TimeZoneInfo(match._id, match._baseUtcOffset, match._displayName, match._standardDisplayName, match._daylightDisplayName, match._adjustmentRules, false); } } else { value = null; } return(result); }
private static void PopulateAllSystemTimeZones(CachedData cachedData) { Debug.Assert(Monitor.IsEntered(cachedData)); uint index = 0; TIME_DYNAMIC_ZONE_INFORMATION tdzi; while (Interop.mincore.EnumDynamicTimeZoneInformation(index, out tdzi) != Interop.Errors.ERROR_NO_MORE_ITEMS) { TimeZoneInformation timeZoneInformation = new TimeZoneInformation(tdzi); TimeZoneInfo value; Exception e; TimeZoneInfoResult result = TryGetTimeZone(ref timeZoneInformation, false, out value, out e, cachedData); index++; } }