TwoDigitYearMax の既定値は 2049

GregorianCalendar などのカレンダー クラスには、2 桁の年で表すことができる 100 年の範囲の最後の年を定義する TwoDigitYearMax プロパティがあります。 このプロパティは、多くの場合、2 桁の年を 4 桁の年に変換するために使用されます。 以前は、GregorianCalendar のほか、JulianCalendarEastAsianLunisolarCalendar などのグレゴリオ暦に似たカレンダーの場合、Calendar.TwoDigitYearMax の既定値は 2029 に設定されていました。 この値は、00 から 29 までの 2 桁の年が 2000 年から 2029 年に変換されたことを意味します。 30 から 99 までの 2 桁の年は 1930 年から 1999 年に変換されました。 GregorianCalendar およびその他のグレゴリオ暦に似たカレンダーの既定のTwoDigitYearMaxプロパティの値が 2029 から 2049 に変更されました。 新しい値は、00 から 49 までの 2 桁の年が 2000 年から 2049 年に変換されることを意味します。 50 から 99 までの任意の年は、1950 年から 1999 年に変換されます。

さらに、Windows では、対応する Windows 設定 (この既定値も 2049 になりました) から TwoDigitYearMax プロパティの既定値が取得されます。 これは、.NET 5 より前の動作と一致します。

日付の解析は、この変更の影響を最も受ける機能です。

以前の動作

.NET 6 と .NET 7 では、TwoDigitYearMax の値を指定しなかった場合、グレゴリオ暦で "12/10/35" のような文字列を解析すると、"1935 年 12 月 10 日" という日付が生成されます。

新しい動作

.NET 8 以降では、グレゴリオ暦で "12/10/35" のような文字列を解析すると、"2035 年 12 月 10 日" という日付が生成されます。

導入されたバージョン

.NET 8 Preview 1

破壊的変更の種類

この変更は、動作変更です。

変更理由

現在の年の 2 桁に比較的近い 2 桁の年を解析して、前の世紀ではなく、現在のそれの 4 桁の年を生成する方が論理的です。 Windows オペレーティング システムでは、既定の設定も同じ数値 (2049) に変更されました。

文字列を日付に解析するときにアプリが既定値に依存しないようにする場合は、TwoDigitYearMax プロパティを設定して 2 桁の年を 4 桁の年に変換する方法を制御できます。 次のコードは、インバリアント カルチャに対してこれを設定する方法を示しています。

CultureInfo clonedInvariantCulture = (CultureInfo)(CultureInfo.InvariantCulture.Clone());
clonedInvariantCulture.DateTimeFormat.Calendar.TwoDigitYearMax = 2039; // Use any desired cutoff value.

DateTime dt = DateTime.Parse("12/25/45", clonedInvariantCulture);

影響を受ける API

関連項目