Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corert.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs')
-rw-r--r--src/System.Private.CoreLib/shared/System/TimeZoneInfo.AdjustmentRule.cs27
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.