2010-03-31 69 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的别名)