解析2位数日期

时间:2015-12-31 18:25:39

标签: c# .net datetime

我试图读取一种格式很旧的文件。

其中日期格式是以yymmdd格式指定的,其中[00,59]范围内的2位数年份被认为是21世纪,而年份范围是[60,99]。被认为是在20世纪,59代表2059年,60代表1960年。

我如何将其解析为C#中的DateTime

我已经尝试过:

string str = ReadDateFromFile();
DateTime dt;    
DateTime.TryParseExact(str, "yyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

但默认的2位数年份规则将[00,29]范围内的值视为21世纪,将值[30,99]视为20世纪。

有没有办法修改此行为以执行我想要的操作,或者是否有我可以使用的其他技术?

3 个答案:

答案 0 :(得分:4)

只需将世纪前缀附加到字符串,然后更改格式字符串以解析四位数年份

mon-put-data

您可以修改Calendar.TwoDigitYearMax并使用修改后的文化进行解析

string str = ReadDateFromFile();
if (int.Parse(str.Substring(0, 2) >= 60)
   str = "19" + str;
else
   str = "20" + str;

DateTime dt;    
DateTime.TryParseExact(str, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);

答案 1 :(得分:3)

我认为在这种情况下,使用正则表达式(如(\d{2})(\d{2})(\d{2}))分别提取年,月和日会更容易,然后,执行业务逻辑并构造新的日期时间对象从那里。

如果这是您的应用程序中的常见行为,您可能需要考虑将其作为扩展方法。

答案 2 :(得分:2)

您可以使用正则表达式来解析日期的值,然后使用自定义逻辑构建它:

var regex = new Regex(@"(?<year>\d{2})(?<month>\d{2})(?<day>\d{2})");
var match = regex.Match(str);
var year = int.Parse(match.Groups["year"].Value);
// Same for day and month
var date = new DateTime(
    year >= 60 ? 1900 + year : 2000 + year,
    month, day);
return date;