C#DateTime.TryParse格式相同,日期不同

时间:2013-03-29 07:59:32

标签: c# datetime tryparse

DateTime res;
String s;

s = "Wed, 28 Mar 2012 10:30:52 GMT";
DateTime.TryParse(s, out res);
Console.WriteLine(s + " => " + res);

s = "Fri, 15 May 2009 20:10:57 GMT";
DateTime.TryParse(s, out res);
Console.WriteLine(s + " => " + res);

输出:

Wed, 28 Mar 2012 10:30:52 GMT => 01/01/0001 00.00.00
Fri, 15 May 2009 20:10:57 GMT => 15/05/2009 22.10.57

为什么它仅适用于某些日期?显然我是在同一台机器上同时运行该代码。

4 个答案:

答案 0 :(得分:2)

我希望你工作的文化的长期格式可能只接受@VimalStan所建议的完整月份名称(你有没有证实这一点,但是?)。

应该(恕我直言)接受你正在尝试做的事情,但我知道各种文化都可能有这样的“怪癖”。例如,在某些文化中,“mar”可能含糊不清? (虽然你的文化中可能没有含糊不清......也许有些代码已经从一种文化延伸到另一种文化......我不知道文化规则是如何实现的,所以不要真的知道这是不是甚至是一个有效的建议......但我认为特定的文化可能并不总是按照预期行事,我认为是公平的。)

使用http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.currentculture.aspx检查运行.NET上下文的文化。您可以通过控制面板查看Windows用户配置文件运行的上下文(例如Win 7上的“区域和语言”),以及看看那里的长日期格式。

您的示例在我的电脑上运行正常,其中长日期格式为“dddd,d MMMM yyyy”。我在澳大利亚,使用en-au。

作为测试,尝试使用en-au“英语(澳大利亚)作为您的文化(通过控制面板,或根据上述currentculture链接明确设置,在”明确设置CurrentCulture属性“标题,然后测试您的代码是否按预期工作。

如果它按预期工作,我认为这意味着问题只是你的文化在解析方面比我的文化要严格得多,比如我的文化(例如你的预期)。因此,您可能需要确保通过整个月,或者使用TryParseExact()根据另一个答案指定您自己的特定解析模式。

答案 1 :(得分:1)

前几天我遇到了同样的问题,因为没有必要让它失败,所以非常令人沮丧。

然而,我解决问题的方法是转移到DateTime.TryParseExact

使用如下:

// Parse date with no style flags.
dateString = " 5/01/2009 8:30 AM";
if (DateTime.TryParseExact(dateString, "g", enUS, 
                          DateTimeStyles.None, out dateValue))
   Console.WriteLine("Converted '{0}' to {1} ({2}).", 
                             dateString, 
                              dateValue, 
                             dateValue.Kind);
else
   Console.WriteLine("'{0}' is not in an acceptable format.", dateString);

由于切换解析从未失败

答案 2 :(得分:1)

试试这个:

DateTime res;
String s = "Wed, 28 Mar 2012 10:30:52 GMT";
DateTime.TryParseExact(s, "R", CultureInfo.InvariantCulture, DateTimeStyles.None, out res);

这将给出:{3/28/2012 10:30:52 AM}

此外,

String s = "Fri, 15 May 2009 20:10:57 GMT";

这将给出:{5/15/2009 8:10:57 PM}

答案 3 :(得分:0)

这只是一个猜测,但也许问题是意大利语“Mar”是“Martedì”(星期二)这个词的开头,所以“Wed,28 Mar 2012 10:30:52 GMT”可能被误解为像“星期三马丁”/星期二“这样荒谬的事情。

作为一个反例,我在2013年寻找了一个Martedì/星期二28,并且用一个月代替星期几:

2013年3月28日10:30:52 GMT => 28/05/2013 12.30.52

显然它无法使用其他语言环境。