繁体   English   中英

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

[英]C# DateTime.TryParse same format, different date

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

为什么它仅在某些日期有效? 显然,我同时在同一台计算机上运行了该代码。

我希望您正在使用的文化的长期格式可能只接受@VimalStan建议的完整月份名称(您是否已经确认了这两种方法?)。

它(IMHO)也应该接受您正在尝试做的事情,但是我知道各种文化都可能有这样的“怪癖”。 例如,“ mar”在某些文化中可能是模棱两可的? (虽然它在您的文化中可能不是模棱两可的……也许某些代码已经从一种文化中转移到另一种文化中了……我不知道文化规则是如何实施的,所以真的不知道这是否是甚至是有效的建议……但我认为特定文化可能并不总是表现出预期,这是公平的)。

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

您的示例在我的PC上工作正常,长日期格式为“ dddd,d MMMM yyyy”。 我在澳大利亚,使用en-au。

作为测试,请尝试使用en-au“英语(澳大利亚)”作为您的文化(通过控制面板,或根据上述currentculture链接进行显式设置,位于“显式设置CurrentCulture属性”标题下),然后测试您的代码是否有效如预期的那样。

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

前几天,我遇到了同样的问题,这很令人沮丧,因为它没有必要失败。

但是我解决问题的方法是移动到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);

由于切换解析从未失败

尝试这个:

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}{3/28/2012 10:30:52 AM}

而且,当

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

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

只是一个猜测,但是问题可能是意大利语中的“ Mar”是“Martedì”(星期二)一词的开头,因此“ Wed,2012 Mar 28,10:30:52 GMT”可能会被误解为类似“荒谬的“星期三Martedì/ Tuesday”。

作为反例,我在2013年寻找Martedì/ Tuesday 28,它可以代替星期几和月份:

2013年5月28日10:30:52 GMT => 2013年5月28日12.30.52

显然,使用其他语言环境无法正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM