summaryrefslogtreecommitdiff
path: root/src/mscorlib/src/System/TimeZoneInfo.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/mscorlib/src/System/TimeZoneInfo.cs')
-rw-r--r--src/mscorlib/src/System/TimeZoneInfo.cs74
1 files changed, 45 insertions, 29 deletions
diff --git a/src/mscorlib/src/System/TimeZoneInfo.cs b/src/mscorlib/src/System/TimeZoneInfo.cs
index fc5625be2e..29ea33a8ad 100644
--- a/src/mscorlib/src/System/TimeZoneInfo.cs
+++ b/src/mscorlib/src/System/TimeZoneInfo.cs
@@ -4,6 +4,7 @@
using System.Collections.Generic;
using System.Collections.ObjectModel;
+using System.Diagnostics;
using System.Diagnostics.Contracts;
using System.Globalization;
using System.Runtime.Serialization;
@@ -164,7 +165,7 @@ namespace System
{
if (!SupportsDaylightSavingTime)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeOffsetIsNotAmbiguous"), nameof(dateTimeOffset));
+ throw new ArgumentException(SR.Argument_DateTimeOffsetIsNotAmbiguous, nameof(dateTimeOffset));
}
Contract.EndContractBlock();
@@ -180,7 +181,7 @@ namespace System
if (!isAmbiguous)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeOffsetIsNotAmbiguous"), nameof(dateTimeOffset));
+ throw new ArgumentException(SR.Argument_DateTimeOffsetIsNotAmbiguous, nameof(dateTimeOffset));
}
// the passed in dateTime is ambiguous in this TimeZoneInfo instance
@@ -210,7 +211,7 @@ namespace System
{
if (!SupportsDaylightSavingTime)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeIsNotAmbiguous"), nameof(dateTime));
+ throw new ArgumentException(SR.Argument_DateTimeIsNotAmbiguous, nameof(dateTime));
}
Contract.EndContractBlock();
@@ -240,7 +241,7 @@ namespace System
if (!isAmbiguous)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeIsNotAmbiguous"), nameof(dateTime));
+ throw new ArgumentException(SR.Argument_DateTimeIsNotAmbiguous, nameof(dateTime));
}
// the passed in dateTime is ambiguous in this TimeZoneInfo instance
@@ -513,7 +514,6 @@ namespace System
if ((dateTime.Kind == DateTimeKind.Unspecified) ||
(dateTime.Kind == DateTimeKind.Local && s_cachedData.GetCorrespondingKind(this) == DateTimeKind.Local))
{
-
// only check Unspecified and (Local when this TimeZoneInfo instance is Local)
AdjustmentRule rule = GetAdjustmentRuleForTime(dateTime);
@@ -650,7 +650,7 @@ namespace System
DateTimeKind sourceKind = cachedData.GetCorrespondingKind(sourceTimeZone);
if (((flags & TimeZoneInfoOptions.NoThrowOnInvalidTime) == 0) && (dateTime.Kind != DateTimeKind.Unspecified) && (dateTime.Kind != sourceKind))
{
- throw new ArgumentException(Environment.GetResourceString("Argument_ConvertMismatch"), nameof(sourceTimeZone));
+ throw new ArgumentException(SR.Argument_ConvertMismatch, nameof(sourceTimeZone));
}
//
@@ -676,7 +676,7 @@ namespace System
// period that supports DST
if (((flags & TimeZoneInfoOptions.NoThrowOnInvalidTime) == 0) && GetIsInvalidTime(dateTime, sourceRule, sourceDaylightTime))
{
- throw new ArgumentException(Environment.GetResourceString("Argument_DateTimeIsInvalid"), nameof(dateTime));
+ throw new ArgumentException(SR.Argument_DateTimeIsInvalid, nameof(dateTime));
}
sourceIsDaylightSavings = GetIsDaylightSavings(dateTime, sourceRule, sourceDaylightTime, flags);
@@ -768,7 +768,7 @@ namespace System
}
if (source.Length == 0)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidSerializedString", source), nameof(source));
+ throw new ArgumentException(SR.Format(SR.Argument_InvalidSerializedString, source), nameof(source));
}
Contract.EndContractBlock();
@@ -868,7 +868,6 @@ namespace System
return false;
}
}
-
}
return sameRules;
}
@@ -915,7 +914,6 @@ namespace System
AdjustmentRule[] adjustmentRules,
bool disableDaylightSavingTime)
{
-
bool adjustmentRulesSupportDst;
ValidateTimeZoneInfo(id, baseUtcOffset, adjustmentRules, out adjustmentRulesSupportDst);
@@ -1004,16 +1002,16 @@ namespace System
if (adjustmentRulesSupportDst != _supportsDaylightSavingTime)
{
- throw new SerializationException(Environment.GetResourceString("Serialization_CorruptField", "SupportsDaylightSavingTime"));
+ throw new SerializationException(SR.Format(SR.Serialization_CorruptField, "SupportsDaylightSavingTime"));
}
}
catch (ArgumentException e)
{
- throw new SerializationException(Environment.GetResourceString("Serialization_InvalidData"), e);
+ throw new SerializationException(SR.Serialization_InvalidData, e);
}
catch (InvalidTimeZoneException e)
{
- throw new SerializationException(Environment.GetResourceString("Serialization_InvalidData"), e);
+ throw new SerializationException(SR.Serialization_InvalidData, e);
}
}
@@ -1034,7 +1032,7 @@ namespace System
info.AddValue("SupportsDaylightSavingTime", _supportsDaylightSavingTime);
}
- TimeZoneInfo(SerializationInfo info, StreamingContext context)
+ private TimeZoneInfo(SerializationInfo info, StreamingContext context)
{
if (info == null)
{
@@ -1065,14 +1063,29 @@ namespace System
(dateTime + BaseUtcOffset).Date :
dateTime.Date;
- for (int i = 0; i < _adjustmentRules.Length; i++)
+ int low = 0;
+ int high = _adjustmentRules.Length - 1;
+
+ while (low <= high)
{
- AdjustmentRule rule = _adjustmentRules[i];
- AdjustmentRule previousRule = i > 0 ? _adjustmentRules[i - 1] : rule;
- if (IsAdjustmentRuleValid(rule, previousRule, dateTime, date, dateTimeisUtc))
+ int median = low + ((high - low) >> 1);
+
+ AdjustmentRule rule = _adjustmentRules[median];
+ AdjustmentRule previousRule = median > 0 ? _adjustmentRules[median - 1] : rule;
+
+ int compareResult = CompareAdjustmentRuleToDateTime(rule, previousRule, dateTime, date, dateTimeisUtc);
+ if (compareResult == 0)
{
return rule;
}
+ else if (compareResult < 0)
+ {
+ low = median + 1;
+ }
+ else
+ {
+ high = median - 1;
+ }
}
return null;
@@ -1081,7 +1094,12 @@ namespace System
/// <summary>
/// Determines if 'rule' is the correct AdjustmentRule for the given dateTime.
/// </summary>
- private bool IsAdjustmentRuleValid(AdjustmentRule rule, AdjustmentRule previousRule,
+ /// <returns>
+ /// A value less than zero if rule is for times before dateTime.
+ /// Zero if rule is correct for dateTime.
+ /// A value greater than zero if rule is for times after dateTime.
+ /// </returns>
+ private int CompareAdjustmentRuleToDateTime(AdjustmentRule rule, AdjustmentRule previousRule,
DateTime dateTime, DateTime dateOnly, bool dateTimeisUtc)
{
bool isAfterStart;
@@ -1103,7 +1121,7 @@ namespace System
if (!isAfterStart)
{
- return false;
+ return 1;
}
bool isBeforeEnd;
@@ -1121,7 +1139,7 @@ namespace System
isBeforeEnd = dateOnly <= rule.DateEnd;
}
- return isBeforeEnd;
+ return isBeforeEnd ? 0 : -1;
}
/// <summary>
@@ -1430,7 +1448,6 @@ namespace System
}
catch (ArgumentOutOfRangeException) { }
}
-
}
}
@@ -1884,18 +1901,17 @@ namespace System
if (id.Length == 0)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_InvalidId", id), nameof(id));
+ throw new ArgumentException(SR.Format(SR.Argument_InvalidId, id), nameof(id));
}
if (UtcOffsetOutOfRange(baseUtcOffset))
{
-
- throw new ArgumentOutOfRangeException(nameof(baseUtcOffset), Environment.GetResourceString("ArgumentOutOfRange_UtcOffset"));
+ throw new ArgumentOutOfRangeException(nameof(baseUtcOffset), SR.ArgumentOutOfRange_UtcOffset);
}
if (baseUtcOffset.Ticks % TimeSpan.TicksPerMinute != 0)
{
- throw new ArgumentException(Environment.GetResourceString("Argument_TimeSpanHasSeconds"), nameof(baseUtcOffset));
+ throw new ArgumentException(SR.Argument_TimeSpanHasSeconds, nameof(baseUtcOffset));
}
Contract.EndContractBlock();
@@ -1919,7 +1935,7 @@ namespace System
if (current == null)
{
- throw new InvalidTimeZoneException(Environment.GetResourceString("Argument_AdjustmentRulesNoNulls"));
+ throw new InvalidTimeZoneException(SR.Argument_AdjustmentRulesNoNulls);
}
// FUTURE: check to see if this rule supports Daylight Saving Time
@@ -1928,13 +1944,13 @@ namespace System
if (UtcOffsetOutOfRange(baseUtcOffset + current.DaylightDelta))
{
- throw new InvalidTimeZoneException(Environment.GetResourceString("ArgumentOutOfRange_UtcOffsetAndDaylightDelta"));
+ throw new InvalidTimeZoneException(SR.ArgumentOutOfRange_UtcOffsetAndDaylightDelta);
}
if (prev != null && current.DateStart <= prev.DateEnd)
{
// verify the rules are in chronological order and the DateStart/DateEnd do not overlap
- throw new InvalidTimeZoneException(Environment.GetResourceString("Argument_AdjustmentRulesOutOfOrder"));
+ throw new InvalidTimeZoneException(SR.Argument_AdjustmentRulesOutOfOrder);
}
}
}