C# DateTime.ParseExact 确定年份前缀

4
我有一个关于解析日期字符串的需求,格式为“dd/MM/yy”。如果年份被认为比当前年份大30年,则在年份前加上19。否则,在年份前加上20。
举例: 01/01/50 -> 01/01/1950 01/01/41 -> 01/01/2041
我不确定DateTime.ParseExact如何决定使用哪个前缀,或者我如何强制它朝着一个方向(它似乎会做出明智的假设,例如01/01/12 -> 01/01/2012,我只是不知道如何指定它将切换的时间点)。

我认为通过 ParseExact 不可能实现。 - Sudhakar Tillapudi
有没有可能使用C#日期API的任何部分,或者我需要编写自己的条件块来在解析之前执行转换? - Troy Patrick
请查看解析非常规年份 - Dour High Arch
2个回答

7

使用Calendar.TwoDigitYearMax属性。

获取或设置可以用2位数年份表示的100年范围的最后一年。

在您的情况下,可以这样做:

// Setup 
var cultureInfo = (CultureInfo)Thread.CurrentThread.CurrentCulture.Clone();
var calendar = cultureInfo.Calendar;
calendar.TwoDigitYearMax = DateTime.Now.Year + 30;
cultureInfo.DateTimeFormat.Calendar = calendar;

// Parse
var _1950 = DateTime.ParseExact("01/01/50", "dd/MM/yy", cultureInfo);
var _2041 = DateTime.ParseExact("01/01/41", "dd/MM/yy", cultureInfo);

这个能用ParseExact吗?还是你建议将其转换为四位数年份,然后使用Calendar.ToFourDigitYear()再使用ParseExact?因为知道这个方法的存在,所以给你点赞。 - Harrison
这个可以使用ParseExact,因为它需要一个CultureInfo作为参数。 - Troy Patrick

0

我不认为ParseExact能够完成你的工作,所以这里是我的版本,它使用了条件块但可以工作。

请尝试这个:

            DateTime currentDate = DateTime.Now;
            String strDate = "01/01/41";
            DateTime userDate=DateTime.ParseExact(strDate, "dd/MM/yy", System.Globalization.CultureInfo.InvariantCulture);
            currentDate=currentDate.AddYears(30);
            if ((userDate.Year%100) > (currentDate.Year%100))
            {
                strDate = strDate.Insert(6, "19");
            }
            else
            {
                strDate = strDate.Insert(6, "20");
            }
            DateTime newUserDate = DateTime.ParseExact(strDate, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接