【问题标题】:Robust DateTime parser library for .NET.NET 的强大的 DateTime 解析器库
【发布时间】:2010-03-31 18:19:43
【问题描述】:

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

我遇到了解析DateTimes 的问题。我发现在野外显示日期的方式存在很大差异,因此我开始编写这样的函数:

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 的事实。我已经切换了代码。 但它仍然是错误和不完整的。

【问题讨论】:

标签: .net datetime parsing xamarin.ios


【解决方案1】:

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

【讨论】:

  • 我只是想避免自己创建格式数据库。肯定有人已经完成了这项工作?但是感谢您提供的信息,如果我必须自己编写它,这将很有用。
【解决方案2】:

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

【讨论】:

  • 我调用 Parse(检查代码)。在支持的内容方面也有相同的区别。我提供的每个格式字符串都失败了 DateTime.Parse。我需要更多知识。
【解决方案3】:

你可以使用:

DateTime.TryParse()

而不是

DateTime.Parse()

而不是尝试/捕获

【讨论】:

  • 我已经这样做了(见代码)。但是 Parse 对于更奇特的格式仍然会失败。我可以忍受例外,我想要的是更多的格式。
  • 真的吗?我建议你做一个 TryParse 和一个 TryParseExact 而不是你的 try/catch。
  • 解析与 TryParse。他们是一样的!一个抛出异常,另一个没有。 ParseExact 和 TryParseExact 相同。他们使用相同格式的数据库。所以,是的,这有助于我的第 3 点,但例外不是我真正关心的问题。我需要一个了解很多格式的解析器。
【解决方案4】:

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

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

我目前正在项目中使用来自上一个 url 的代码。尽管该项目尚未投入生产,但代码似乎可以正常工作。

BarDev

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      如果我有时间(很可能,因为我什至可能会为此获得报酬),我会尝试将它作为一个积极维护的项目复活。

      【讨论】:

      猜你喜欢
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 2018-02-05
      • 2011-09-17
      相关资源
      最近更新 更多