2017-03-04 145 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

相關問題