2010-03-31 72 views
7

我正在用C#(技術上是MonoTouch)編寫RSS和郵件閱讀器應用程序。強大的DateTime .NET解析器庫

我遇到了解析DateTime的問題。我看到日期是如何在野外提出並已開始寫一個函數像這樣的很多方差:

static string[] DateTimeFormats = new string[] { 
    "ddd, d MMM yyyy H:mm:ss \"GMT+00:00\"", 
    "d MMM yyyy H:mm:ss \"EST\"", 
    "yyyy-MM-dd\"T\"HH:mm:ss\"Z\"", 
    "ddd MMM d HH:mm:ss \"+0000\" yyyy", 
}; 
public static DateTime ParseTime(string timeStr) { 

    var r = DateTime.MinValue; 

    var styles = DateTimeStyles.AdjustToUniversal | 
       DateTimeStyles.AllowWhiteSpaces; 

    if (DateTime.TryParse(timeStr, 
          CultureInfo.InvariantCulture, 
           styles, 
           out r)) { 
     return r; 
    } 
    else {    
     if (DateTime.TryParseExact(timeStr, 
            DateTimeFormats, 
            CultureInfo.InvariantCulture, 
            styles, 
            out r)) { 
      return r; // BUGGY! Ignores time zone!! 
     } 
    } 

    Console.WriteLine ("BAAAAAAAAAAAAD"); 
    return DateTime.MinValue; 
} 

這,好吧,讓我感到噁心。兩點。 (1)我認爲我實際上可以收集一份格式列表,這將涵蓋所有內容,這很愚蠢。 (2)這是錯的!請注意,我將EST日期時間視爲UTC(因爲.NET似乎無視時區)。

我正在尋找一個已知的庫來處理一堆這些格式。

此外,我想繼續在我的代碼中使用UTC日期時間,所以建議任何庫應該能夠產生日期時間。

有沒有像這樣的東西?

更新這似乎我不清楚在我的要求。我正在尋找一個知道很多這些wild格式字符串的庫。 DateTime.Parse/DateTime.TryParse只知道幾種格式,而且他們當然不懂時區(你可以看到我已經在使用它)。我需要比 DateTime.Parse/DateTime.TryParse更強大的功能。

更新2每個人都在談論我使用Parse而不是TryParse的事實。我已經切換了代碼。 但它仍然是錯誤的和不完整的。

+1

最後野田時可以提供一些這方面的功能:http://code.google.com/p/noda-time/ – TrueWill 2010-03-31 19:41:44

+0

可能想查看[datetime-tryparse-all-possible-type-of-dates](http://stackoverflow.com/questions/2326127/datetime-tryparse-all-possible-type-of-日期) – nawfal 2014-01-30 09:42:32

回答

2

您是否嘗試過使用DateTime.TryParse?該功能已經處理了大多數格式。

+0

我打電話給Parse(檢查代碼)。就**支持**而言,這是相同的區別。我提供的每個格式字符串均失敗DateTime.Parse。我需要更多知識。 – 2010-03-31 18:24:59

1

你可以使用:

DateTime.TryParse() 

代替

DateTime.Parse() 

,而不是一個try/catch

+0

我已經這樣做(見代碼)。但Parse對於更奇特的格式仍然會失敗。我可以忍受例外情況,我想要的格式更多。 – 2010-03-31 18:26:52

+0

真的嗎?我建議你做一個TryParse和一個TryParseExact而不是你的try/catch。 – hunter 2010-03-31 18:30:37

+0

解析與TryParse。他們是一樣的!一個拋出異常,另一個不拋出。 ParseExact和TryParseExact相同。他們使用相同的格式數據庫。所以是的,這有助於我的觀點#3,但例外情況並不是我真正關心的。我需要一個知道很多格式的解析器。 – 2010-03-31 18:39:09

3

除了TryParse上的日期時間,.NET還可以提供DateTimeOffset結構,其報價訪問UTC偏移作爲結構上的另一個屬性,允許您將時區信息和日期時間信息一起存儲。

+0

我只是想避免自己創建一個格式數據庫。當然,有人肯定已經完成了這項工作?但是,感謝這些信息,如果我必須自己寫,這會很有用。 – 2010-03-31 18:34:38

+0

+1 Joel!留下你的sumbitch我的問題! – hunter 2010-03-31 18:55:29

0

我已經制定了分析日期的庫(NaturalDate),但它可能不是你要找的內容,因爲它是針對人力投入的形式,而不是計算機生成的形式。 IIRC甚至可能不會解析上面顯示的表單。此外,該網站暫時關閉(這是該服務器上唯一的東西)。

如果我有一些時間(可能,因爲我可能會得到報酬),我會嘗試恢復它作爲一個積極維護的項目。

+0

你可能想在這裏添加它[robust-datetime-parser-library-for-net](http://stackoverflow.com/questions/7297622/robust-datetime-parser-library-for-net) – nawfal 2014-01-30 09:41:16

1

我對rss提要有同樣的問題,其中包括帶時區名稱的日期,而不是偏移量。我想過爲這種情況創建我自己的DateTime Parser,但我相信有人可能已經創建了它。搜索了幾個小時後,我發現以下

C#:解析日期時間與時區
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

我目前使用此代碼從一個項目之前的URL。儘管該項目還沒有推出,代碼似乎工作。

BarDev

1

弗蘭克,解析您想使用zz或zzz的時區。

的MonoTouch的未​​來版本也將支持新的「K」修飾符(這是ZZZ的別名)