为什么DateTime.ParseExact()不能用“M / d / yyyy”parsing“9/1/2009”
我有一个如下所示的string:“9/1/2009”。 我想将其转换为DateTime对象(使用C#)。
这工作:
DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
但我不明白为什么这不起作用:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
在date(如“九月”)没有字,我知道具体的格式,所以我宁愿使用ParseExact(我不明白为什么需要CultureInfo)。 但我不断得到可怕的“string未被识别为有效的date时间”exception。
谢谢
稍微跟进一下。 这里有三种方法可以工作:
DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", null); DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
这里有3个不起作用的:
DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.CurrentCulture); DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
所以,Parse()适用于“en-US”,但不适用于ParseExact …意外?
我怀疑问题是格式string与数据中的斜杠相反。 这是格式string中文化敏感的date分隔符,最后一个参数为null
表示“使用当前文化”。 如果您要么跳过斜杠(“M”/“d”/“yyyy”), 要么指定CultureInfo.InvariantCulture
,这样可以。
如果有人有兴趣重现这一点:
// Works DateTime dt = DateTime.ParseExact("9/1/2009", "M'/'d'/'yyyy", new CultureInfo("de-DE")); // Works DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US")); // Works DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", CultureInfo.InvariantCulture); // Fails DateTime dt = DateTime.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("de-DE"));
我敢打赌你的机器的文化不是“en-US”。 从文档 :
如果提供程序是空引用(在Visual Basic中为Nothing),则使用当前文化。
如果你现在的文化不是“en-US”,这就解释了为什么它适合我,但是不适合你, 并且在你明确指定文化是“en-US”时工作。
尝试
Date.ParseExact("9/1/2009", "M/d/yyyy", new CultureInfo("en-US"))
尝试这个
provider = new CultureInfo("en-US"); DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);
再见。
我在XP上试了一下,如果电脑设置为国际时间yyyy-Md,它也不起作用。 在行上放置一个断点,并在处理之前将datestring改为使用' – '替代'/',你会发现它的工作原理。 不pipe你是否有文化信息,都没有区别。 似乎奇怪的是能够指定一个只有格式被忽略的分隔符。
试试:
在webconfiguration文件中configuration
<system.web> <globalization culture="ja-JP" uiCulture="zh-HK" /> </system.web>
例如:DateTime dt = DateTime.ParseExact(“08/21/2013”,“MM / dd / yyyy”,null);
refurl: http : //support.microsoft.com/kb/306162/
将DateTimePicker的Format属性设置为自定义,将CustomFormat
属性设置为M/dd/yyyy
。