diff options
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs')
-rw-r--r-- | src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs b/src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs index 0e949a30e..aceb7b90f 100644 --- a/src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs +++ b/src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs @@ -11,6 +11,8 @@ namespace System [Serializable] public sealed class AdjustmentRule : IEquatable<AdjustmentRule>, ISerializable, IDeserializationCallback { + private static readonly TimeSpan DaylightDeltaAdjustment = TimeSpan.FromHours(24.0); + private static readonly TimeSpan MaxDaylightDelta = TimeSpan.FromHours(12.0); private readonly DateTime _dateStart; private readonly DateTime _dateEnd; private readonly TimeSpan _daylightDelta; @@ -39,8 +41,8 @@ namespace System internal bool HasDaylightSaving => DaylightDelta != TimeSpan.Zero || - (DaylightTransitionStart != default(TransitionTime) && DaylightTransitionStart.TimeOfDay != DateTime.MinValue) || - (DaylightTransitionEnd != default(TransitionTime) && DaylightTransitionEnd.TimeOfDay != DateTime.MinValue.AddMilliseconds(1)); + (DaylightTransitionStart != default && DaylightTransitionStart.TimeOfDay != DateTime.MinValue) || + (DaylightTransitionEnd != default && DaylightTransitionEnd.TimeOfDay != DateTime.MinValue.AddMilliseconds(1)); public bool Equals(AdjustmentRule other) => other != null && @@ -100,6 +102,7 @@ namespace System TimeSpan baseUtcOffsetDelta, bool noDaylightTransitions) { + AdjustDaylightDeltaToExpectedRange(ref daylightDelta, ref baseUtcOffsetDelta); return new AdjustmentRule( dateStart, dateEnd, @@ -186,6 +189,26 @@ namespace System } } + /// <summary> + /// Ensures the daylight delta is within [-12, 12] hours + /// </summary>> + private static void AdjustDaylightDeltaToExpectedRange(ref TimeSpan daylightDelta, ref TimeSpan baseUtcOffsetDelta) + { + if (daylightDelta > MaxDaylightDelta) + { + daylightDelta -= DaylightDeltaAdjustment; + baseUtcOffsetDelta += DaylightDeltaAdjustment; + } + else if (daylightDelta < -MaxDaylightDelta) + { + daylightDelta += DaylightDeltaAdjustment; + baseUtcOffsetDelta -= DaylightDeltaAdjustment; + } + + System.Diagnostics.Debug.Assert(daylightDelta <= MaxDaylightDelta && daylightDelta >= -MaxDaylightDelta, + "DaylightDelta should not ever be more than 24h"); + } + void IDeserializationCallback.OnDeserialization(object sender) { // OnDeserialization is called after each instance of this class is deserialized. |