我试图读取一种格式很旧的文件。
其中日期格式是以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世纪。
有没有办法修改此行为以执行我想要的操作,或者是否有我可以使用的其他技术?
答案 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;