c# - 解析 2 位日期

标签 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);

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

有没有一种方法可以修改此行为以执行我想要的操作,或者我可以使用其他技术吗?

最佳答案

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

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);

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

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

关于c# - 解析 2 位日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34550290/

相关文章:

c# - EWS 托管 API。 IsNew 总是返回 false 并且不能使用 TextBody

c# - 为什么左外连接?

c# - Linq - 按ID从数据库中选择记录

c# - 使用 Unity 容器注册递归结构

c# - 如何减去两个日期导致几天或几周?

c# - Math.Pow() 如何在 .NET Framework 中实现?

.net - 将 ComboBox 绑定(bind)到 IList 并使用 SelectedValue

c# - 在项目中使用同一 DLL 的不同版本

java - 字符串到 LocalDate 的 Joda 时间解析不正确

python - 在程序上下文中向日期时间输入添加异常处理的最简单方法是什么?