2017-03-04 142 views
1

我正在使用Xamarin(主要是表单),前几天我发现了这个问题。2017年3月1日DateTime.Parse问题

当我打电话给webservice时,我在Date字段的响应头上查看并尝试解析它。

这正常工作,直到2月28日的:

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

但是,从开始03月01日的:

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

我得到: “字符串未被识别为有效的DateTime”。但这是一个有效的日期时间! 01三月2017是一个星期三...

好吧,我知道退出ParseExact(我试过和工作),但如何.Parse()?

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

行军的所有日子将无法识别和解析..它重新启动,从01月

任何人遇到这种行为的工作?

+0

你是什么'CurrentCulture'到底是什么?它可以具有'ddd,d ...'而不是'ddd,dd ...'作为标准的日期和时间格式。 –

+0

的CurrentCulture: –

+0

的CurrentCulture:{它-IT}和的DateTimeFormatInfo是: \t FullDateTimePattern: “DDDD d MMMM YYYY HH:MM:SS” \t LongDatePattern: “DDDD d MMMM YYYY” \t LongTimePattern:“HH:MM:SS “ \t MonthDayPattern: ”d MMMM“ \t RFC1123Pattern: ”DDD,DD MMM YYYY HH ':' 毫米 ':' SS 'GMT“' \t ShortDatePattern: ”DD/MM/YYYY“ \t ShortTimePattern:” HH: mm“ \t SortableDateTimePattern:”yyyy“ - 'MM' - 'dd'T'HH':'mm':'ss' \t UniversalSortableDateTimePattern :“yyyy” - 'MM' - 'dd HH':​​'mm':'ss'Z'“ \t YearMonthPattern:”MMMM yyyy“...但为什么它从2016年9月开始一直工作到2月28日?星期三,2017年2月1日被正确识别... –

回答

0

问题仅Mono mcs编译器似乎重现性好,不.Net框架。

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

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. 

,意思是“字符串未被识别为有效的DateTime,因为一周中的一天是不正确的”,而"Mar"是正确"MMM"格式月。

看起来他们没有考虑到一个月,每天可以在目前的意大利语言相同的缩写。

为DateTime.Parse一个可能的解决方法是

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

[相关](http://stackoverflow.com/questions/9521016/datetime-parse-fails-for-today-01-mar-2012-o-0) – 2017-03-05 00:27:27

3

我认为Hans是正确的。看起来像你的“Mar”是而不是Parse方法中解析为marzo的缩写月份名称,即3月的意大利语。它试图将其解析为martedi的缩写天名,而非意大利语星期二。而且,由于您尝试在字符串中解析两个不同的缩写日期名称,因此会发生异常。

但是,它仍然是太诡异了与意大利文化解析你的英语月份和日期名称。使用基于英文的文化,而不是像InvariantCulture。如果你有自定义格式,你可能想要选择ParseExactTryParseExact方法来防止这种模棱两可的情况。

+0

但是为什么这个'DateTime.Parse(“Wed,01 Mar 2017 11:07:06 GMT”,CultureInfo.GetCultureInfo(“it-IT”));'甚至这个'DateTime.Parse(“Wed,01 Mar 2017 11:07:06 GMT“,CultureInfo.GetCultureInfo(”RU-RU“));'工作正常吗? – Evk

+0

@Evk由于这是标准的日期和时间格式,称为[RFC1123Pattern](https://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.rfc1123pattern),它将使用“r”或“在“ToString”方法中使用“R”。它说:“RFC1123模式反映了一个已定义的标准,并且该属性是只读的。因此,无论culture_如何,它总是相同的。自定义格式字符串是'ddd,dd MMM yyyy HH':​​'mm' :'ss'GMT'“。我认为这也适用于解析操作。 –

+0

好的,所以OP使用它 - IT文化,为什么它不适合他呢?你的第一段和你的评论似乎相互矛盾,而不是? – Evk

相关问题