diff options
Diffstat (limited to 'src/mscorlib/src/System/Globalization/GregorianCalendar.cs')
-rw-r--r-- | src/mscorlib/src/System/Globalization/GregorianCalendar.cs | 266 |
1 files changed, 153 insertions, 113 deletions
diff --git a/src/mscorlib/src/System/Globalization/GregorianCalendar.cs b/src/mscorlib/src/System/Globalization/GregorianCalendar.cs index 9083e6de27..6dbf5b2786 100644 --- a/src/mscorlib/src/System/Globalization/GregorianCalendar.cs +++ b/src/mscorlib/src/System/Globalization/GregorianCalendar.cs @@ -2,27 +2,20 @@ // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. -namespace System.Globalization { - // - // N.B.: - // A lot of this code is directly from DateTime.cs. If you update that class, - // update this one as well. - // However, we still need these duplicated code because we will add era support - // in this class. - // - // - - using System.Threading; - using System; - using System.Globalization; - using System.Runtime.Serialization; - using System.Diagnostics.Contracts; - +using System; +using System.Globalization; +using System.Diagnostics.Contracts; +using System.Runtime.Serialization; +using System.Threading; + +namespace System.Globalization +{ // This calendar recognizes two era values: // 0 CurrentEra (AD) // 1 BeforeCurrentEra (BC) [Serializable] + public class GregorianCalendar : Calendar { /* @@ -57,24 +50,16 @@ namespace System.Globalization { private static volatile Calendar s_defaultInstance; - -#region Serialization [OnDeserialized] private void OnDeserialized(StreamingContext ctx) { - if (m_type < GregorianCalendarTypes.Localized || - m_type > GregorianCalendarTypes.TransliteratedFrench) + if (m_type < GregorianCalendarTypes.Localized || + m_type > GregorianCalendarTypes.TransliteratedFrench) { throw new SerializationException( - String.Format( - CultureInfo.CurrentCulture, - Environment.GetResourceString( - "Serialization_MemberOutOfRange"), - "type", - "GregorianCalendar")); + String.Format(CultureInfo.CurrentCulture, SR.Serialization_MemberOutOfRange, "type", "GregorianCalendar")); } } -#endregion Serialization public override DateTime MinSupportedDateTime { @@ -92,9 +77,6 @@ namespace System.Globalization { } } - // Return the type of the Gregorian calendar. - // - public override CalendarAlgorithmType AlgorithmType { get @@ -111,8 +93,10 @@ namespace System.Globalization { **Exceptions: ============================================================================*/ - internal static Calendar GetDefaultInstance() { - if (s_defaultInstance == null) { + internal static Calendar GetDefaultInstance() + { + if (s_defaultInstance == null) + { s_defaultInstance = new GregorianCalendar(); } return (s_defaultInstance); @@ -121,30 +105,37 @@ namespace System.Globalization { // Construct an instance of gregorian calendar. public GregorianCalendar() : - this(GregorianCalendarTypes.Localized) { + this(GregorianCalendarTypes.Localized) + { } - public GregorianCalendar(GregorianCalendarTypes type) { - if ((int)type < (int)GregorianCalendarTypes.Localized || (int)type > (int)GregorianCalendarTypes.TransliteratedFrench) { + public GregorianCalendar(GregorianCalendarTypes type) + { + if ((int)type < (int)GregorianCalendarTypes.Localized || (int)type > (int)GregorianCalendarTypes.TransliteratedFrench) + { throw new ArgumentOutOfRangeException( nameof(type), - Environment.GetResourceString("ArgumentOutOfRange_Range", + SR.Format(SR.ArgumentOutOfRange_Range, GregorianCalendarTypes.Localized, GregorianCalendarTypes.TransliteratedFrench)); } Contract.EndContractBlock(); this.m_type = type; } - public virtual GregorianCalendarTypes CalendarType { - get { + public virtual GregorianCalendarTypes CalendarType + { + get + { return (m_type); } - set { + set + { VerifyWritable(); - switch (value) { + switch (value) + { case GregorianCalendarTypes.Localized: case GregorianCalendarTypes.USEnglish: case GregorianCalendarTypes.MiddleEastFrench: @@ -155,18 +146,20 @@ namespace System.Globalization { break; default: - throw new ArgumentOutOfRangeException(nameof(m_type), Environment.GetResourceString("ArgumentOutOfRange_Enum")); + throw new ArgumentOutOfRangeException("m_type", SR.ArgumentOutOfRange_Enum); } } } - internal override int ID { - get { + internal override CalendarId ID + { + get + { // By returning different ID for different variations of GregorianCalendar, // we can support the Transliterated Gregorian calendar. // DateTimeFormatInfo will use this ID to get formatting information about // the calendar. - return ((int)m_type); + return ((CalendarId)m_type); } } @@ -210,7 +203,7 @@ namespace System.Globalization { // Leap year calculation looks different from IsLeapYear since y1, y4, // and y100 are relative to year 1, not year 0 bool leapYear = (y1 == 3 && (y4 != 24 || y100 == 3)); - int[] days = leapYear? DaysToMonth366: DaysToMonth365; + int[] days = leapYear ? DaysToMonth366 : DaysToMonth365; // All months have less than 32 days, so n >> 5 is a good conservative // estimate for the month int m = (n >> 5) + 1; @@ -240,23 +233,26 @@ namespace System.Globalization { ** ============================================================================*/ - internal static long GetAbsoluteDate(int year, int month, int day) { + internal static long GetAbsoluteDate(int year, int month, int day) + { if (year >= 1 && year <= MaxYear && month >= 1 && month <= 12) { - int[] days = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) ? DaysToMonth366: DaysToMonth365; - if (day >= 1 && (day <= days[month] - days[month - 1])) { + int[] days = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0))) ? DaysToMonth366 : DaysToMonth365; + if (day >= 1 && (day <= days[month] - days[month - 1])) + { int y = year - 1; int absoluteDate = y * 365 + y / 4 - y / 100 + y / 400 + days[month - 1] + day - 1; return (absoluteDate); } } - throw new ArgumentOutOfRangeException(null, Environment.GetResourceString("ArgumentOutOfRange_BadYearMonthDay")); + throw new ArgumentOutOfRangeException(null, SR.ArgumentOutOfRange_BadYearMonthDay); } // Returns the tick count corresponding to the given year, month, and day. // Will check the if the parameters are valid. - internal virtual long DateToTicks(int year, int month, int day) { - return (GetAbsoluteDate(year, month, day)* TicksPerDay); + internal virtual long DateToTicks(int year, int month, int day) + { + return (GetAbsoluteDate(year, month, day) * TicksPerDay); } // Returns the DateTime resulting from adding the given number of @@ -279,12 +275,13 @@ namespace System.Globalization { public override DateTime AddMonths(DateTime time, int months) { - if (months < -120000 || months > 120000) { + if (months < -120000 || months > 120000) + { throw new ArgumentOutOfRangeException( nameof(months), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), + SR.ArgumentOutOfRange_Range, -120000, 120000)); } @@ -303,7 +300,7 @@ namespace System.Globalization { m = 12 + (i + 1) % 12; y = y + (i - 11) / 12; } - int[] daysArray = (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) ? DaysToMonth366: DaysToMonth365; + int[] daysArray = (y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) ? DaysToMonth366 : DaysToMonth365; int days = (daysArray[m] - daysArray[m - 1]); if (d > days) @@ -364,19 +361,23 @@ namespace System.Globalization { // month arguments. // - public override int GetDaysInMonth(int year, int month, int era) { - if (era == CurrentEra || era == ADEra) { - if (year < 1 || year > MaxYear) { - throw new ArgumentOutOfRangeException(nameof(year), Environment.GetResourceString("ArgumentOutOfRange_Range", + public override int GetDaysInMonth(int year, int month, int era) + { + if (era == CurrentEra || era == ADEra) + { + if (year < 1 || year > MaxYear) + { + throw new ArgumentOutOfRangeException(nameof(year), SR.Format(SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - if (month < 1 || month > 12) { - throw new ArgumentOutOfRangeException(nameof(month), Environment.GetResourceString("ArgumentOutOfRange_Month")); + if (month < 1 || month > 12) + { + throw new ArgumentOutOfRangeException(nameof(month), SR.ArgumentOutOfRange_Month); } - int[] days = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? DaysToMonth366: DaysToMonth365); + int[] days = ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? DaysToMonth366 : DaysToMonth365); return (days[month] - days[month - 1]); } - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } // Returns the number of days in the year given by the year argument for the current era. @@ -384,19 +385,21 @@ namespace System.Globalization { public override int GetDaysInYear(int year, int era) { - if (era == CurrentEra || era == ADEra) { - if (year >= 1 && year <= MaxYear) { - return ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 366:365); + if (era == CurrentEra || era == ADEra) + { + if (year >= 1 && year <= MaxYear) + { + return ((year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)) ? 366 : 365); } throw new ArgumentOutOfRangeException( nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } // Returns the era for the specified DateTime value. @@ -407,9 +410,11 @@ namespace System.Globalization { } - public override int[] Eras { - get { - return (new int[] {ADEra} ); + public override int[] Eras + { + get + { + return (new int[] { ADEra }); } } @@ -427,7 +432,8 @@ namespace System.Globalization { public override int GetMonthsInYear(int year, int era) { - if (era == CurrentEra || era == ADEra) { + if (era == CurrentEra || era == ADEra) + { if (year >= 1 && year <= MaxYear) { return (12); @@ -436,11 +442,11 @@ namespace System.Globalization { nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } // Returns the year part of the specified DateTime. The returned value is an @@ -458,30 +464,35 @@ namespace System.Globalization { public override bool IsLeapDay(int year, int month, int day, int era) { - if (month < 1 || month > 12) { - throw new ArgumentOutOfRangeException(nameof(month), Environment.GetResourceString("ArgumentOutOfRange_Range", + if (month < 1 || month > 12) + { + throw new ArgumentOutOfRangeException(nameof(month), SR.Format(SR.ArgumentOutOfRange_Range, 1, 12)); } Contract.EndContractBlock(); if (era != CurrentEra && era != ADEra) { - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } - if (year < 1 || year > MaxYear) { + if (year < 1 || year > MaxYear) + { throw new ArgumentOutOfRangeException( nameof(year), - Environment.GetResourceString("ArgumentOutOfRange_Range", 1, MaxYear)); + SR.Format(SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - if (day < 1 || day > GetDaysInMonth(year, month)) { - throw new ArgumentOutOfRangeException(nameof(day), Environment.GetResourceString("ArgumentOutOfRange_Range", + if (day < 1 || day > GetDaysInMonth(year, month)) + { + throw new ArgumentOutOfRangeException(nameof(day), SR.Format(SR.ArgumentOutOfRange_Range, 1, GetDaysInMonth(year, month))); } - if (!IsLeapYear(year)) { + if (!IsLeapYear(year)) + { return (false); } - if (month == 2 && day == 29) { + if (month == 2 && day == 29) + { return (true); } return (false); @@ -495,14 +506,15 @@ namespace System.Globalization { { if (era != CurrentEra && era != ADEra) { - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } - if (year < 1 || year > MaxYear) { + if (year < 1 || year > MaxYear) + { throw new ArgumentOutOfRangeException( nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), 1, MaxYear)); + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } Contract.EndContractBlock(); return (0); @@ -514,34 +526,39 @@ namespace System.Globalization { public override bool IsLeapMonth(int year, int month, int era) { - if (era != CurrentEra && era != ADEra) { - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + if (era != CurrentEra && era != ADEra) + { + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } - if (year < 1 || year > MaxYear) { + if (year < 1 || year > MaxYear) + { throw new ArgumentOutOfRangeException( nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), 1, MaxYear)); + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - if (month < 1 || month > 12) { - throw new ArgumentOutOfRangeException(nameof(month), Environment.GetResourceString("ArgumentOutOfRange_Range", + if (month < 1 || month > 12) + { + throw new ArgumentOutOfRangeException(nameof(month), SR.Format(SR.ArgumentOutOfRange_Range, 1, 12)); } Contract.EndContractBlock(); return (false); - } // Checks whether a given year in the specified era is a leap year. This method returns true if // year is a leap year, or false if not. // - public override bool IsLeapYear(int year, int era) { - if (era == CurrentEra || era == ADEra) { - if (year >= 1 && year <= MaxYear) { + public override bool IsLeapYear(int year, int era) + { + if (era == CurrentEra || era == ADEra) + { + if (year >= 1 && year <= MaxYear) + { return (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); } @@ -549,9 +566,9 @@ namespace System.Globalization { nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), 1, MaxYear)); + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } // Returns the date and time converted to a DateTime value. Throws an exception if the n-tuple is invalid. @@ -559,15 +576,32 @@ namespace System.Globalization { public override DateTime ToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era) { - if (era == CurrentEra || era == ADEra) { + if (era == CurrentEra || era == ADEra) + { return new DateTime(year, month, day, hour, minute, second, millisecond); } - throw new ArgumentOutOfRangeException(nameof(era), Environment.GetResourceString("ArgumentOutOfRange_InvalidEraValue")); + throw new ArgumentOutOfRangeException(nameof(era), SR.ArgumentOutOfRange_InvalidEraValue); } - internal override Boolean TryToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era, out DateTime result) { - if (era == CurrentEra || era == ADEra) { - return DateTime.TryCreate(year, month, day, hour, minute, second, millisecond, out result); + internal override Boolean TryToDateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, int era, out DateTime result) + { + if (era == CurrentEra || era == ADEra) + { + try + { + result = new DateTime(year, month, day, hour, minute, second, millisecond); + return true; + } + catch (ArgumentOutOfRangeException) + { + result = DateTime.Now; + return false; + } + catch (ArgumentException) + { + result = DateTime.Now; + return false; + } } result = DateTime.MinValue; return false; @@ -578,43 +612,49 @@ namespace System.Globalization { public override int TwoDigitYearMax { - get { - if (twoDigitYearMax == -1) { + get + { + if (twoDigitYearMax == -1) + { twoDigitYearMax = GetSystemTwoDigitYearSetting(ID, DEFAULT_TWO_DIGIT_YEAR_MAX); } return (twoDigitYearMax); } - set { + set + { VerifyWritable(); - if (value < 99 || value > MaxYear) { + if (value < 99 || value > MaxYear) + { throw new ArgumentOutOfRangeException( "year", String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), + SR.ArgumentOutOfRange_Range, 99, MaxYear)); - } twoDigitYearMax = value; } } - public override int ToFourDigitYear(int year) { - if (year < 0) { + public override int ToFourDigitYear(int year) + { + if (year < 0) + { throw new ArgumentOutOfRangeException(nameof(year), - Environment.GetResourceString("ArgumentOutOfRange_NeedNonNegNum")); + SR.ArgumentOutOfRange_NeedNonNegNum); } Contract.EndContractBlock(); - if (year > MaxYear) { + if (year > MaxYear) + { throw new ArgumentOutOfRangeException( nameof(year), String.Format( CultureInfo.CurrentCulture, - Environment.GetResourceString("ArgumentOutOfRange_Range"), 1, MaxYear)); + SR.ArgumentOutOfRange_Range, 1, MaxYear)); } return (base.ToFourDigitYear(year)); } |