用于.NET的强大的DateTime解析器库

时间:2010-03-31 18:19:44

标签: .net datetime parsing xamarin.ios

我正在用C#(技术上是MonoTouch)编写RSS和邮件阅读器应用程序。

我遇到了解析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 DateTimes,因此建议的任何库都应该能够生成DateTimes。

有没有像这样的东西?

更新我的请求似乎不清楚。我正在寻找一个知道很多 wild 格式字符串的库。 DateTime.Parse / DateTime.TryParse只知道几种格式,他们肯定不懂时区(你可以看到我已经在使用它了)。我需要一些比它强大的东西 DateTime.Parse / DateTime.TryParse。

更新2 每个人都在思考我使用的是Parse而不是TryParse。我已经切换了代码。 但它仍然是错误的和不完整的。

6 个答案:

答案 0 :(得分:3)

除了DateTime上的TryParse之外,.Net还提供DateTimeOffset结构,它提供对UTC偏移的访问作为结构上的另一个属性,允许您将时区信息和日期时间信息存储在一起

答案 1 :(得分:2)

您是否尝试过使用DateTime.TryParse?该功能已经处理了大多数格式。

答案 2 :(得分:1)

您可以使用:

DateTime.TryParse()

而不是

DateTime.Parse()

而不是try / catch

答案 3 :(得分:1)

我对rss feed遇到了同样的问题,其中包含带有时区名称的日期,而不是偏移量。我考虑过为这种情况创建自己的DateTime Parser,但我发现有人可能已经创建了它。经过几个小时的搜索,我发现了以下内容

C#:使用TimeZone解析DateTime
http://hashfactor.wordpress.com/2009/02/02/c-parsing-datetime-with-timezone/

我目前正在使用项目中前一个网址的代码。即使该项目尚未生效,代码似乎也可行。

BarDev

答案 4 :(得分:1)

Frank,要解析你想要使用zz或zzz的时区。

未来版本的MonoTouch还将支持新的“K”修饰符(这是zzz的别名)

答案 5 :(得分:0)

我开发了一个用于解析日期的库(NaturalDate),但它可能不是您正在寻找的,因为它是针对人类输入表单,而不是计算机生成的表单。 IIRC甚至可能无法解析您在上面显示的表格。此外,该网站暂时停机(这是该服务器上唯一的东西)。

如果我得到一些时间(可能,因为我甚至可能会得到报酬),我会尝试将其恢复为积极维护的项目。