2009-04-30 64 views
1

我收到一些垃圾數據從一個ToString()返回在C#DateTime對象上調用我怕我關注着它一段時間後難住了。難倒C#的DateTime的ToString()格式問題

功能應該日期格式是符合RFC 822(所要求的RSS規範),看起來像:

public static string FormatPubDate(DateTime pubDate) 
{ 
    string _rfc822Format = "ddd, dd MMM yyyy HH:mm:ss"; 
    string _tmp = pubDate.ToUniversalTime().ToString(_rfc822Format); 

    return pubDate.ToString(_tmp + " UT"); 
} 

這應該是我想要的東西,從我所讀的DateTime ToString()文檔。

然而,對於一些日期它產生的垃圾:

Console.WriteLine(FormatPubDate(new DateTime(2008, 12, 16, 13, 44, 33))); 
Console.WriteLine(FormatPubDate(new DateTime(2008, 12, 17, 13, 44, 33))); 
Console.WriteLine(FormatPubDate(new DateTime(2009, 3, 18, 4, 17, 20))); 
Console.WriteLine(FormatPubDate(new DateTime(2009, 4, 30, 10, 44, 33))); 

產量:

Tue, 16 Dec 2008 19:44:33 UT 
We17, 17 Dec 2008 19:44:33 UT 
We18, 18 3ar 2009 09:17:20 UT 
T10u, 30 Apr 2009 15:44:33 UT 

任何想法,爲什麼它返回WE18而不是週三和3AR,而不是Mar嗎?

+0

如果取出ToUniversalTime()調用它的工作原理?這可能會改變文化和格式字符串是文化特定的。 – 2009-04-30 16:08:18

+0

@John - Nope。我嘗試過,並在幾臺不同的機器上運行我的程序。 – Dana 2009-04-30 16:09:14

回答

13

你的問題是最後

return pubDate.ToString(_tmp + " UT"); 

你做的對日期時間第二的ToString()的格式化的值,如格式化...

嘗試將其更改爲

string _rfc822Format = "ddd, dd MMM yyyy HH:mm:ss"; 
string _tmp = pubDate.ToUniversalTime().ToString(_rfc822Format); 

return _tmp + " UT"; 
3

你可以用這個來代替?:

String.Format("{0:r}", dt); // "Sun, 09 Mar 2008 16:05:07 GMT" RFC1123 
+1

或只是dt.ToString( 「R」); – 2009-04-30 16:10:53

+0

好點。其他海報是在識別你的原貼代碼額外的ToString()調用正確的... – 2009-04-30 16:14:22

3

您正在呼籲日期的ToString,傳遞你的RFC格式,那麼你再次呼籲日期的ToString,apssing你已經轉換日期+「UT」的格式,我驚訝你得到什麼好東西來了出來了!

試試這個:

public static string FormatPubDate(DateTime pubDate) 
{ 
    string _rfc822Format = "ddd, dd MMM yyyy HH:mm:ss"; 
    return pubDate.ToUniversalTime().ToString(_rfc822Format) + " UT"; 

}