2012-06-28 31 views
2

我试图用一个单一的格式字符串阅读下列格式的日期:DateTime.ParseExact非传统年

"1000.12.31" 
"999.12.31" 
"99.12.31" 

这将对应日期在多年的公元1000年,公元999和99广告。

我试过下面的格式字符串:

yyyy.M.d。这在999年和99年都失败了。

yy.M.d。这个失败了1000和999.它也解释99为1999.

我即将诉诸手动解析它(这很简单),但我很好奇,如果这样的事情甚至可能与DateTime.ParseExact或者使用另一种内置方法?

+0

'y.M.d'不工作吗? – leppie

+0

“99.12.31”对人类也不明确。 *没有人会去“啊,这当然是在Marcus Ulpius Nerva Traianus Augustus统治年的99年”。每个选秀权1999年。它用机器不会变得更好。 –

+0

@leppie:nope,与'yy.M.d' iirc结果相同。 @Hans对我来说,在这方面它并不含糊。我知道我总是希望99是99,而不是1999,我只是不能指定。就像几个月和几个月一样,它们可能不明确(1/2,是feb 1st还是1月1日?),但是如果您知道期望什么,则可以在格式字符串中指定它。 – Bubblewrap

回答

2

这对手动解析是微不足道的;我认为不值得努力去适应DateTime.ParseExact

string str = "99.12.31"; 
int[] parts = str.Split('.').Select(int.Parse).ToArray(); 
DateTime date = new DateTime(parts[0], parts[1], parts[2]); 
2

我认为最简单的方法是采取现有的字符串,在一年前坚持几个零,并使用现有的DateTime.ParseExact。

然而,你实现它,我会去做一个小的手动字符串按摩,并用DateTime.ParseExact做繁重的工作。

static DateTime ParseExactYear(string input) 
{ 
    switch (input.IndexOf('.')) 
    { 
     case 1: input = "000" + input; break; 
     case 2: input = "00" + input; break; 
     case 3: input = "0" + input; break; 
    } 

    return DateTime.ParseExact(input, "yyyy.M.d", null); 
} 

Debug.WriteLine(ParseExactYear("1000.12.31")); 
Debug.WriteLine(ParseExactYear("999.12.31")); 
Debug.WriteLine(ParseExactYear("99.12.31")); 
Debug.WriteLine(ParseExactYear("9.12.31")); 

Debug.WriteLine(ParseExactYear("1000.1.1")); 
Debug.WriteLine(ParseExactYear("999.1.1")); 
Debug.WriteLine(ParseExactYear("99.1.1")); 
Debug.WriteLine(ParseExactYear("9.1.1")); 

Output: 
12/31/1000 12:00:00 AM 
12/31/0999 12:00:00 AM 
12/31/0099 12:00:00 AM 
12/31/0009 12:00:00 AM 
1/1/1000 12:00:00 AM 
1/1/0999 12:00:00 AM 
1/1/0099 12:00:00 AM 
1/1/0009 12:00:00 AM 
+0

然后在''1.1.1“'上爆炸:*( – leppie

+0

这是假设月和天总是用2位数表示 – Matthew

+0

@Matthew:并且也忽略了单位数字的年份; p – leppie

2

由于当前文化的DateTimeFormatInfo值,它将99解释为1999。如果你想改变解析行为必须更改DateTimeFormatInfo

string eg = "9.1.2"; 
DateTime dt; 

var fi = new System.Globalization.DateTimeFormatInfo(); 
fi.Calendar = (System.Globalization.Calendar)fi.Calendar.Clone(); 
fi.Calendar.TwoDigitYearMax = 99; 
fi.ShortDatePattern = "y.M.d"; 
bool b = DateTime.TryParse(eg, fi, System.Globalization.DateTimeStyles.None, out dt); 

DateTimeFormatInfo共享相同的Calendar对象的新实例;如果要定制特定实例,则必须使用Clone