public OffsetAndRule GetOneYearLocalFromUtc(int year) { OffsetAndRule? oneYearLocFromUtc = _oneYearLocalFromUtc; if (oneYearLocFromUtc == null || oneYearLocFromUtc.Year != year) { TimeZoneInfo currentYear = GetCurrentOneYearLocal(); AdjustmentRule? rule = currentYear._adjustmentRules == null ? null : currentYear._adjustmentRules[0]; oneYearLocFromUtc = new OffsetAndRule(year, currentYear.BaseUtcOffset, rule); _oneYearLocalFromUtc = oneYearLocFromUtc; } return oneYearLocFromUtc; }
// DateTime.Now fast path that avoids allocating an historically accurate TimeZoneInfo.Local and just creates a 1-year (current year) accurate time zone internal static TimeSpan GetDateTimeNowUtcOffsetFromUtc(DateTime time, out bool isAmbiguousLocalDst) { bool isDaylightSavings = false; isAmbiguousLocalDst = false; TimeSpan baseOffset; int timeYear = time.Year; OffsetAndRule match = s_cachedData.GetOneYearLocalFromUtc(timeYear); baseOffset = match.Offset; if (match.Rule != null) { baseOffset = baseOffset + match.Rule.BaseUtcOffsetDelta; if (match.Rule.HasDaylightSaving) { isDaylightSavings = GetIsDaylightSavingsFromUtc(time, timeYear, match.Offset, match.Rule, out isAmbiguousLocalDst, Local); baseOffset += (isDaylightSavings ? match.Rule.DaylightDelta : TimeSpan.Zero /* FUTURE: rule.StandardDelta */); } } return(baseOffset); }