DateTime.Parse 2017 年 3 月 1 日发行

DateTime.Parse issue on 1st of March 2017

我正在使用 Xamarin(主要是表单),几天前我发现了这个问题。

当我调用网络服务时,我查看响应的 header 的日期字段并尝试解析它。

在 2 月 28 日之前一切正常:

DateTime dt_OK = DateTime.Parse("Tue, 28 Feb 2017 11:07:06 GMT");

但是,从 3 月 01 日开始:

DateTime dt_KO = DateTime.Parse("Wed, 01 Mar 2017 11:07:06 GMT");

我得到:"String was not recognized as a valid DateTime"。但这是一个有效的日期时间! 2017 年 3 月 1 日是星期三...

好的,我知道 exit ParseExact(我尝试过并工作过)但是 .Parse() 怎么样?

DateTime dt_always_ok = DateTime.ParseExact(dateFromHeader, "ddd, dd MMM yyyy HH:mm:ss Z", System.Globalization.CultureInfo.InvariantCulture);

3月的所有日子都不会被识别和解析..它从4月1日重新开始工作。

还有其他人遇到过这种行为吗?

我认为 is on the right way. Looks like your "Mar" is not parsed in Parse method as an abbreviate month name of the marzo which is March in Italian. It try to parse it as an abbreviate day name of the martedi 而不是意大利语中的星期二。由于您尝试解析字符串中两个不同的缩写日名称,因此出现异常。

但是,用意大利文化来解析您的英语月份和日期名称还是太奇怪了。使用 基于英语的 文化而不是像 InvariantCulture. And if you have a custom format, you might wanna choose ParseExact or TryParseExact 方法来防止这种模棱两可的情况。

这个问题似乎只能在 Mono mcs 编译器上重现,不能在 .Net 框架上重现。

在那种情况下,它看起来像一个 known bug,因为即使 (!)

DateTime dt_KO = DateTime.Parse("01 Mar 2017",CultureInfo.GetCultureInfo("it-IT"));

产生以下错误

System.FormatException: Giorno della settimana non corretto. Stringa non riconosciuta come DateTime valido.

表示“String 未被识别为有效的日期时间,因为星期几不正确”,而 "Mar" 是正确的 "MMM" 格式这个月。

看来他们没有考虑到一个月和一天在当前意大利语中可以有相同的缩写。

DateTime.Parse 的可能解决方法是

DateTime dt_KO = DateTime.Parse("Wed, 01 Mar 2017 11:07:06 GMT",
                                CultureInfo.GetCultureInfo("en-US"));