C# 日期时间字符串解析

C# 日期时间字符串解析,c#,.net,c#-2.0,C#,.net,C# 2.0,我制作了一个通用的解析器来解析ascii文件。 当我想解析日期时,我使用DateTime对象中的ParseExact函数来解析,但我遇到了年份问题 要解析的文本是“090812”,解析的字符串是“yyMMdd” 我希望得到一个DateTime对象,上面写着“12/8-2009”,但我得到的是“12/8-1909”。 我知道,我可以在事后解析它,从而修改年份,从而得出一个丑陋的解决方案 有人知道解决这个问题的聪明方法吗 提前谢谢 瑟伦您需要确定适合您的数据的某种阈值日期。如果解析的日期早于此日期,

我制作了一个通用的解析器来解析ascii文件。 当我想解析日期时,我使用DateTime对象中的ParseExact函数来解析,但我遇到了年份问题

要解析的文本是“090812”,解析的字符串是“yyMMdd”

我希望得到一个DateTime对象,上面写着“12/8-2009”,但我得到的是“12/8-1909”。 我知道,我可以在事后解析它,从而修改年份,从而得出一个丑陋的解决方案

有人知道解决这个问题的聪明方法吗

提前谢谢


瑟伦

您需要确定适合您的数据的某种阈值日期。如果解析的日期早于此日期,请添加100年。一种安全的方法是在输入字符串前面加上适当的世纪前缀。在本例中,我选择1970年作为截止日期:

string input = ...;
DateTime myDate;

if (Convert.ToInt32(input.Substring(0, 2)) < 70)
    myDate = DateTime.ParseExact("20" + input, ...);
else
    myDate = DateTime.ParseExact("19" + input, ...); 
字符串输入=。。。;
日期时间myDate;
if(Convert.ToInt32(input.Substring(0,2))<70)
myDate=DateTime.ParseExact(“20”+输入,…);
其他的
myDate=DateTime.ParseExact(“19”+输入,…);

Jon Skeet还发布了一个很好的例子,使用了我一时忘记的
DateTimeFormatInfo
:)

好吧,如果你确定所有的源日期都是本世纪,那么你可以使用parseExact来表示“20”-带前缀的源字符串。

理论上优雅的方法:更改用于解析文本的
DateTimeFormatInfo
所使用的
Calendar
TwoDigitYearMax
属性。例如:

CultureInfo current = CultureInfo.CurrentCulture;
DateTimeFormatInfo dtfi = (DateTimeFormatInfo) current.DateTimeFormat.Clone();
// I'm not *sure* whether this is necessary
dtfi.Calendar = (Calendar) dtfi.Calendar.Clone();
dtfi.Calendar.TwoDigitYearMax = 1910;
然后在调用
DateTime.ParseExact
时使用
dtfi


实际操作方法:在输入的开始处添加“20”,并用“yyyyMMdd”进行解析。

文档和其他帖子建议在您提供的日期(例如2009年为09年)使用此方法。你能把你打的电话发出去吗?更多信息:我有点喜欢你的理论解。无论如何,
DateTimeFormatInfo
只是一次设置。它还允许不同的截止值,而不仅仅是假设一切都在本世纪。。不太清楚,你想做什么。。!?但无论如何,dtfi.Calendar.TwoDigitYearMax只能设置为99以上的数字:-(…我对在前面加上“20”的解决方案不太满意,因为我不能保证这不是用来查看旧数据<2000年..@MullerDK:对不起,它应该设置为2000年…或者如果你想将100812设置为1910年,可能是1910年等。(编辑了1910年的代码。)你最早看到的年份是什么?在某个时候,你会得到一个模糊的格式…你不能用两个十进制数字来表示超过100年的范围。请注意,如果你将它设置为1910,那么明年你需要将它设置为1911等。你可能想使用
DateTime.Now.year-100
.FYI DateTimeFormatInfo.Clone()是否调用此.Calendar.Clone()