我正在用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。我已经切换了代码。 但它仍然是错误的和不完整的。
答案 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甚至可能无法解析您在上面显示的表格。此外,该网站暂时停机(这是该服务器上唯一的东西)。
如果我得到一些时间(可能,因为我甚至可能会得到报酬),我会尝试将其恢复为积极维护的项目。