2010-07-23 69 views
13

虽然与DateTime.ParseExact格式问题挣扎,我决定喂ParseExact的出离则DateTime.ToString()说,像这样的:为什么不能DateTime.ParseExact解析DateTime输出?

DateTime date2 = new DateTime(1962, 1, 27); 
string[] expectedFormats = { "G", "g", "f", "F", "D", "d", "M/d/yyy", "MM/dd/yyy", "MM-dd-yyy", "MMM dd, yyy", "MMM dd yyy", "MMMM dd, yyy", "MMMM dd yyy" }; 
bool parsed = false; 

foreach (string fmt in expectedFormats) 
{ 
    try 
    { 
     DateTime dtDateTime = DateTime.ParseExact(date2.ToString(fmt), fmt, new CultureInfo("en-US")); 
     parsed = true; 
    } 
    catch (Exception) 
    { 
     parsed = false; 
    } 

    Console.WriteLine("[{0}] {1}", parsed,date2.ToString(fmt)); 
} 

这是输出:

[True] 1/27/1962 12:00:00 AM 
[True] 1/27/1962 12:00 AM 
[True] Saturday, January 27, 1962 12:00 AM 
[True] Saturday, January 27, 1962 12:00:00 AM 
[True] Saturday, January 27, 1962 
[True] 1/27/1962 
[False] 1/27/1962 
[False] 01/27/1962 
[False] 01-27-1962 
[False] Jan 27, 1962 
[False] Jan 27 1962 
[False] January 27, 1962 
[False] January 27 1962 

做什么我必须这样做ParseExact将解析自定义格式字符串?我期望DateTime能够根据相同的格式字符串摄取它自己的输出,我错了吗?

+1

这不是错误的原因,但对于信息:你是通过一个特定的文化解析,但使用默认区域性的ToString。这本身会由于语言环境而导致问题。但是我测试过了,这不是* only *问题。 – 2010-07-23 19:46:45

+0

@Marc:我也通过将相同的文化传递给两种方法来测试它。我也试过'CultureInfo.InvariantCulture'的踢n-grins无济于事。 – 2010-07-23 20:16:07

回答

11

这清楚地表明DateTime.ParseExact不是往返安全的Datetime.ToString。我不确定这是一个多大的答案,但问题肯定与3位数年份格式yyy有关。自1962年以来不能用3位数表示ToString被迫使用4位数字。显然ParseExact是不够智能扭转该逻辑,而是正在寻找3位数字。解决方法是使用yyyy而不是yyy。我会将此作为bug提交到Microsoft Connect网站,看看它是什么。

+0

你说得对。 yyyy修复了这个问题。 – 2010-07-23 20:04:43

+0

确实如此!谢谢! – 2010-07-23 20:10:37

0

我惊讶见状,但在MSDN文档说:

您可以指定标准的日期和时间格式说明符的一个或自定义日期和时间格式说明符的有限组合

http://msdn.microsoft.com/en-us/library/2h3syy57.aspx

更新

您可以使用上一个答案中提到的解决方法。

0

我拿了你的代码,把“yyy”改为“yyyy”就足以为他们全部返回“TRUE”(在我做任何改变之前首先复制了“FALSE”)。

在MSDN文档还不清楚,但强调需要无固定区域性指明每一个组件的全宽(如YYYY而不是YYY):

http://msdn.microsoft.com/en-us/library/w2sa9yss.aspx

如果格式不包含日期或时间分隔符(例如“yyyyMMdd HHmm”)的自定义格式模式使用供应商参数的不变文化和每个自定义格式说明符的最宽格式。例如,如果要以格式指定小时数,请指定较宽的格式“HH”,而不是较窄的格式“H”。

+0

空格,破折号和斜杠是日期/时间分隔符。 – Powerlord 2010-07-23 20:20:50

+1

我也看到了。但是Greg的示例代码确实使用了分隔符,所以这个子句似乎不适用。尽管如此,它仍然是一个很好的信息。 – 2010-07-23 20:43:15

+0

我同意你们MSDN上的措辞表明日期/时间分隔符是关键因素,但是使用“yyyy”自己运行代码可以解决问题。 – 2010-07-23 21:10:51