解析2位数日期

Pha*_*rap 8 .net c# datetime

我正在尝试使用非常旧的格式读取一种文件.

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

我如何将其解析为DateTimeC#?

我试过做:

string str = ReadDateFromFile();
DateTime dt;    
DateTime.TryParseExact(str, "yyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out dt);
Run Code Online (Sandbox Code Playgroud)

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

有没有办法修改这种行为来做我想要的或者是否有我可以使用的不同技术?

Ham*_*jam 6

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

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);
Run Code Online (Sandbox Code Playgroud)

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

var myCulture = (CultureInfo)CultureInfo.InvariantCulture.Clone();
myCulture.Calendar.TwoDigitYearMax = 2059;
DateTime dt;
DateTime.TryParseExact(str, "yyMMdd", myCulture, DateTimeStyles.None, out dt);
Run Code Online (Sandbox Code Playgroud)

  • @bto.rdz 真的更干净吗?很难一眼就看出它在做什么。 (2认同)
  • @bto.rdz,您正在将字符串与 int 进行比较。 (2认同)

ReP*_*rre 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;
Run Code Online (Sandbox Code Playgroud)