2010-01-04 112 views
7

我有一個問題,其中包含在Gmail Atom提要中的特定時間字符串未使用DateTime.Parse()解析。我知道我可以使用DateTime.TryParse(),但我很好奇爲什麼這兩個不起作用,其餘的都是。DateTime.Parse問題,不支持在System.Globalization.GregorianCalendar

2009-12-28T24:11:48Z 
2009-12-30T24:16:20Z 

具體的例外是:

System.FormatException:日期時間用字符串表示的日曆System.Globalization.GregorianCalendar不支持。

我懷疑是因爲24小時而不是00,但我不確定我會如何糾正這種情況。

+0

任何人都知道gmail atom v0.3 feed(https://mail.google.com/mail/feed/atom)是否仍然返回這些不正確的時間戳到這個日期? – 2013-07-08 22:07:40

回答

16
private static DateTime ParseDate(string s) 
{ 
    DateTime result; 
    if (!DateTime.TryParse(s, out result)) 
    {     
     result = DateTime.ParseExact(s, "yyyy-MM-ddT24:mm:ssK", System.Globalization.CultureInfo.InvariantCulture); 
     result = result.AddDays(1); 
    } 
    return result; 
} 
+0

好混搭;)+1 – 2010-01-04 16:30:03

+0

哦,哈哈! +1 – 2010-01-04 16:30:37

+0

太棒了。非常感謝你:) – 2010-01-04 16:42:27

1

原來谷歌使用w3c日期和時間標準:http://www.w3.org/TR/NOTE-datetime,哪些c#不支持?奇怪,但不是很奇怪。

這個項目似乎是爲你實現的。

http://www.codeproject.com/KB/cs/w3cdate.aspx

編輯:是的,我現在看到,谷歌不這樣做是正確的,但在w3cdate C#結構有一個例外了點。

+0

但是,該規範聲明「hh =小時(00到23)(上午/下午不允許)的兩位數字」。 – 2010-01-04 16:02:21

+0

雖然他們沒有得到正確的答案。正如文件鏈接說一個小時24是不允許的。 「hh =小時的兩位數字(00至23)(上午/下午不允許)」 – 2010-01-04 16:03:03

+0

您連接的w3規格中的'24'不允許 '「hh =小時的兩位數字(00至23) (am/pm不允許)「' C#支持該標準,但Google正在使用其他一些標準或變體。雖然你鏈接的項目確實佔了上面。 – 2010-01-04 16:06:41

2

如果它僅僅是24而不是00,你可以簡單地更換和添加​​一天:

String s = "2009-12-28T24:11:48Z"; 
DateTime dt; 
if (s.Contains("T24:") 
{ 
    s = s.Replace("T24:", "T00:"); 

    if (DateTime.TryParse(s, out dt)) 
     dt.AddDays(1); 
} 
else 
{ 
    DateTime.TryParse(s, out dt); 
} 
+0

通過這樣做,您還需要在傳遞後添加一個。 – 2010-01-04 16:05:01

+0

@Martin - 你說得對,編輯過。 – 2010-01-04 16:14:07

1

The DateTime entry in MSDN說支持ISO 8601功能,這使24和00應該允許的格式鍵入[YYYY][MM][DD]T[hh][mm]Z例如。 2010-01-04T14:04Z

午夜是一種特殊情況,並且可以是 稱爲兩個「00:00」和 「24:00」。在日曆日開始時使用符號「00:00」 ,並且 是更頻繁使用的。在 結束一天使用「24:00」。請注意, 「2007-04-05T24:00」與「2007-04-06T00:00」(請參閱​​下面的日期和時間組合 表示法)是相同的即時 。

+3

不幸的是,這只是談論00:00與24:00(半夜)afaik,即:那個確切的時刻。 24:17在這之後相當多,並且據我所知,它是無效的。 – 2010-01-04 16:09:28

+2

我認爲它會允許'24:00'而不是'24:01'。 – 2010-01-04 16:09:55

+0

是的,你是對的。 – 2010-01-05 08:31:07

1

原理相同的md5sum,但以不同的方式:

DateTime.ParseExact(
    "2009-12-28T24:11:48Z", 
    new []{ "yyyy-MM-ddTHH:mm:ssK", "yyyy-MM-ddT24:mm:ssK" }, 
    System.Globalization.CultureInfo.InvariantCulture, 
    System.Globalization.DateTimeStyles.None 
) 

你仍舊需要檢查,如果日期是正確的,但。

+0

返回的日期是'2009年12月27日6:11:48 PM' ...我假設-6小時來自我的時區,但您仍需要添加一天。 – 2010-01-04 16:26:37