public static DateTime SetValidTimeOfDay(DateTime dateTime, TimeSpan timeOfDay, TimeZoneInfo timezone) { dateTime = DateTimeUtils.SetTimeOfDay(dateTime, timeOfDay); // time can be invalid when setting the clock one hour forward if (timezone.IsInvalidTime(dateTime)) { TimeZoneInfo.AdjustmentRule rule = AdjustmentRuleUtils.GetAdjustmentRuleForTime(timezone.GetAdjustmentRules(), dateTime.Date); // rule cannot be null for invalid time dateTime = dateTime.Add(rule.DaylightDelta); } dateTime = DateTime.SpecifyKind(dateTime, DateTimeKind.Unspecified); return(dateTime); }
public static DateTime SafeConvertToUtc(DateTime dateTime, TimeZoneInfo sourceTimeZone) { // time can be invalid when setting the clock one hour forward if (sourceTimeZone.IsInvalidTime(dateTime)) { TimeZoneInfo.AdjustmentRule rule = AdjustmentRuleUtils.GetAdjustmentRuleForTime(sourceTimeZone.GetAdjustmentRules(), dateTime.Date); // rule cannot be null for invalid time return(TimeZoneInfo.ConvertTimeToUtc(dateTime.Add(rule.DaylightDelta), sourceTimeZone)); } else { return(TimeZoneInfo.ConvertTimeToUtc(dateTime, sourceTimeZone)); } }
public static DateTime AdvancedConvertToUtc(DateTime dateTime, TimeZoneInfo sourceTimeZone, bool assumeDaylightTimeForAmbiguousTime) { DateTime result = SafeConvertToUtc(dateTime, sourceTimeZone); // time can be ambiguous when setting the clock one hour backward if (sourceTimeZone.IsAmbiguousTime(dateTime) && assumeDaylightTimeForAmbiguousTime) { TimeZoneInfo.AdjustmentRule rule = AdjustmentRuleUtils.GetAdjustmentRuleForTime(sourceTimeZone.GetAdjustmentRules(), dateTime.Date); // ConvertTimeToUtc will assume standard time, we want it to assume daylight time // rule cannot be null for ambiguous time result = result.Add(-rule.DaylightDelta); } return(result); }