DateTime.Parse忽略我的IFormatProvider?

时间:2015-06-17 10:03:34

标签: c# .net parsing datetime

在我看来,.NET是否忽略了我传递给解析的CultureInfo(IFormatProvider)的TwoDigitYearMax属性?

具体来说,我无法解释为什么最后一行说的是1930年,而不是2030年。任何人都可以复制或解释它吗?

Windows 7,.NET 4.0,en-US系统设置。

using System;
using System.Globalization;

namespace DateTimeParse
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.TwoDigitYearMax);
            Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture);
            Console.WriteLine(DateTime.Parse("1/1/30"));
            CultureInfo myCI = (CultureInfo)System.Threading.Thread.CurrentThread.CurrentCulture.Clone();
            Console.WriteLine(DateTime.Parse("1/1/30", myCI));
            Console.WriteLine(System.Threading.Thread.CurrentThread.CurrentCulture.Calendar.ToFourDigitYear(30));
            myCI.Calendar.TwoDigitYearMax = 2115;
            Console.WriteLine(myCI.Calendar.ToFourDigitYear(30));
            Console.WriteLine(DateTime.Parse("1/1/30", myCI));
            Console.ReadLine();
        }
    }
}

我的结果:

2029
en-US
1/1/1930 12:00:00 AM
1/1/1930 12:00:00 AM
1930
2030
1/1/1930 12:00:00 AM

2 个答案:

答案 0 :(得分:0)

如果您按照reference source进行操作,则只需引用DateTimeFormatInfo即可看到从CultureInfo中提取CultureInfo.DateTimeFormat

Calendar上有一个DateTimeFormatInfo属性,这是解析时使用的属性。这两个通常是相同的(即参考相等),事实上Clone你的CultureInfo导致它们在克隆时各不相同 - 你可以通过reference source来看看CultureInfo.Clone()

您需要更改Calendar上的DateTimeFormatInfo

var culture = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
culture.DateTimeFormat.Calendar.TwoDigitYearMax = 2115;

请参阅此处的工作示例:https://dotnetfiddle.net/IytEvz

答案 1 :(得分:0)

来自documentation for twodigityearmax

  

此属性允许将2位数年份正确翻译为a   4位数年份。例如,如果此属性设置为2029,则   100年的范围是从1930年到2029年。因此,2位数值为30   被解释为1930年,而2位数值29被解释为   2029。

     

此属性的初始值源自中的设置   控制面板的区域和语言选项部分。但是,那   信息可以在AppDomain的生命周期内发生变化。日历   class不会自动检测系统设置中的更改。如果   区域和语言选项不支持日历,   此属性的初始值是由。定义的默认值   日历课。

     

您的应用程序应将此值设置为99以指示该2位数   几年是字面上的。例如,如果设置了此属性   从99开始,100年范围从0开始(大多数情况下不是有效值)   日历)到99.因此,2位数值30被解释为   30。

myCI.Calendar.TwoDigitYearMax = 2115
2115

这为您提供从2016年到2115年的100年范围

myCI.Calendar.ToFourDigitYear(30)
2030

那么30岁就是该范围内的第一年30岁。 即2030