.net 为什么可以';t DateTime.ParseExact()parse";2009年9月1日“;使用;年月日;
我有一个字符串,看起来像这样:“9/1/2009”。我想将其转换为DateTime对象(使用C#) 这项工作:.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)。但我不断收到可
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
),因此更好地表达您意图的选项是带有引号的斜杠(您选择的那个)。@JonDateTime.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);