.net 为什么可以';t DateTime.ParseExact()parse";2009年9月1日“;使用;年月日;

.net 为什么可以';t DateTime.ParseExact()parse";2009年9月1日“;使用;年月日;,.net,datetime,parsing,cultureinfo,.net,Datetime,Parsing,Cultureinfo,我有一个字符串,看起来像这样:“9/1/2009”。我想将其转换为DateTime对象(使用C#) 这项工作: DateTime.Parse("9/1/2009", new CultureInfo("en-US")); 但我不明白为什么这不起作用: DateTime.ParseExact("9/1/2009", "M/d/yyyy", null); 日期中没有单词(比如“九月”),我知道具体的格式,所以我宁愿使用ParseExact(我不明白为什么需要CultureInfo)。但我不断收到可

我有一个字符串,看起来像这样:“9/1/2009”。我想将其转换为DateTime对象(使用C#)

这项工作:

DateTime.Parse("9/1/2009", new CultureInfo("en-US"));
但我不明白为什么这不起作用:

DateTime.ParseExact("9/1/2009", "M/d/yyyy", null);
日期中没有单词(比如“九月”),我知道具体的格式,所以我宁愿使用ParseExact(我不明白为什么需要CultureInfo)。但我不断收到可怕的“字符串未被识别为有效日期时间”异常

谢谢

一点跟进。以下是3种有效的方法:

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。。。意外?

我怀疑问题在于格式字符串中的斜杠与数据中的斜杠。这是格式字符串中的区域性敏感日期分隔符,最后一个参数为
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"));
试一试

试试这个

provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);

再见。

我打赌你的机器的文化不是“en-US”。发件人:

如果提供程序是空引用(Visual Basic中没有),则使用当前区域性


如果您当前的区域性不是“en-US”,这将解释为什么它对我有效,但对您无效,并且当您明确指定区域性为“en-US”时,

我在XP上试用过,如果电脑设置为国际时间yyyy-M-d,它将不起作用。在该行上放置一个断点,在处理该断点之前,将日期字符串更改为使用“-”代替“/”,您会发现它是有效的。你有没有文化信息没有关系。
指定Expercated格式却忽略分隔符似乎很奇怪。

将DateTimePicker的format属性设置为custom,将
CustomFormat
属性设置为
M/dd/yyyy
尝试:

在web配置文件中配置


例如:DateTime dt=DateTime.ParseExact(“2013年8月21日”,“年月日”,空)


参考url:

您使用的是什么版本的.NET?当我在Win7上的PowerShell v2中执行上面的第二行时,它工作正常。我在xp上使用.net 3.5。默认区域性为en-us。在字符串
“M/d/yyyy”
中,每个斜杠
/
都用
区域性.DateTimeFormat.DateSeparator
字符串替换。当您将
null
作为格式提供程序时,将使用当前区域性。现在,这取决于当前区域性是否将
“/”
或其他字符串(如
“-”
)作为其属性。您是对的,其中任何一个都可以工作。我还不确定我喜欢哪一个。我想摆脱斜线会更紧凑。。。谢谢,这已经困扰了我一段时间了!我不知道为什么你的第二个例子对你有用。那对我不起作用。使用CultureInfo(“en-US”)可用于此日期字符串的Parse(),但不能用于此日期字符串和格式字符串的ParseExact。@吉米:这取决于意图。在本例中,/用作精确的斜杠,而不是区域性敏感分隔符(即使区域性是
InvariantCulture
),因此更好地表达您意图的选项是带有引号的斜杠(您选择的那个)。@Jon
DateTime.ParseExact
参数之一是
CultureInfo
。所以如果我写:
newcultureinfo(“de”)
,这意味着我知道日期是用
分隔的。那么,为什么我仍然需要使用以下格式编写:
M/d/yyyy
而不是
M.d.yyyy
?我们不是说过我知道日期是用
分隔的吗?我很难理解它。如果我通过它的文化来识别它,我就知道它应该是什么样子。但是如果你告诉我,用户输入了
9@@1@@2009
,那么我会说-好。让我们使用parseExact。但是我不需要文化。你能帮忙吗?@RoyiNamir:对不起,我真的不明白你在问什么。我想我宁愿使用DateTime.Parse(“9/1/2009”,new CultureInfo(“en-US”))然后,如果我必须指定区域性…?而不是每次解析日期时都实例化一个新的CultureInfo实例(“en-US”),使用CultureInfo.InvariantCulture.实际上这不起作用(至少对我来说?)使用“en US”与Parse一起工作,但与ParseExact(对于此日期和格式字符串)不起作用。有趣的是,CultureInfo.CurrentCulture确实返回“en US”。。。所以我不知道如何解释为什么它对你有效,但对我无效。我尝试了一些方法。以下是有效的方法:DateTime.ParseExact(“9/1/2009”,“M'/'d'/'yyyy”,null);DateTime.ParseExact(“2009年9月1日”,“M/d/yyyy”,CultureInfo.InvariantCulture);DateTime.Parse(“2009年9月1日”,新文化信息(“美国”);这里是不起作用的:DateTime.ParseExact(dateString,“M/d/yyyy”,CultureInfo.CurrentCulture);ParseExact(日期字符串,“M/d/yyyy”,新文化信息(“en-US”);ParseExact(日期字符串,“M/d/yyyy”,null);所以Parse()与“en-US”一起使用,但不是ParseExact。。。有趣吧?在这个问题中没有任何一个建议使用web应用程序。这个问题与DateTimePicker完全无关。
provider = new CultureInfo("en-US");
DateTime.ParseExact("9/1/2009", "M/d/yyyy", provider);