2009-08-14 77 views
8

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

要解析的文本即具有parseExact字符串“yyMMdd”的“090812”。

我希望得到一个DateTime对象说“12/8-2009”,但我得到“12/8-1909”。 我知道,我可以通过解析它,然后做出一个丑陋的解决方案,从而修改年..

任何人都知道一个聪明的方法来解决这个??

在此先感谢..

瑟伦

+0

文档和其他帖子显示这应该适用于您提供的日期(例如2009年的09)。你能发布你正在做的确切的ParseExact调用吗? – Joe 2009-08-14 11:28:31

+1

更多的信息在这里:http://msdn.microsoft.com/en-us/library/system.globalization.gregoriancalendar.tofourdigityear.aspx – Joe 2009-08-14 11:29:49

回答

17

理论上这样做的优雅方式:更改DateTimeFormatInfo用于解析文本的CalendarTwoDigitYearMax属性。例如:

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; 

然后在您的通话使用dtfiDateTime.ParseExact

这样做的实用方法:将“20”添加到输入的开头,并使用“yyyyMMdd”进行解析。

+0

我有点像你的理论解决方案。无论如何,'DateTimeFormatInfo'只是一次性设置。它也允许不同的截止点,而不是假设一切都在本世纪。 – Thorarin 2009-08-14 11:28:50

+0

看起来不错.. 不太确定,你正在尝试做什么..!? 但无论如何,dtfi.Calendar.TwoDigitYearMax只能设置为99 ..以上的数字。:-(.. 而我不喜欢解决方案,只需在前面添加“20”,因为我不能保证这个不习惯看旧数据<年2000 .. – 2009-08-14 11:47:30

+0

@MullerDK:对不起,应该设置为2000 ...或者1910,如果你想100812是1910等。 – 2009-08-14 12:57:11

2

您需要确定某种基准日期的适合您的数据。如果解析日期在此日期之前,请添加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, ...); 

乔恩斯基特还贴使用DateTimeFormatInfo一个很好的例子,我已经暂时忘记了:)

2

好吧,如果你确定你的所有源代码日期是本世纪,那么你可以使用parseExact对“20”前缀的源字符串。