从字符串解析 DateTime 时遇到问题

Posted

技术标签:

【中文标题】从字符串解析 DateTime 时遇到问题【英文标题】:Troubles parsing DateTime from string 【发布时间】:2012-07-22 00:55:49 【问题描述】:

我目前正在尝试解析从每隔几分钟从网络下载的 xml 获得的字符串。字符串如下所示:

Thu Jul 12 08:39:56 GMT+0100 2012

一开始我只是做了一个string.split,然后把时间(GMT+0100 2012)之后的所有东西都拿出来,然后在日期之后插入2012。

这很好,直到日期更改为:

Thu Jul 12 08:39:56 GMT+0000 2012

所以我想动态地解析 GMT+,因为他们在 c# 中向我发送了那个字符串。

任何建议将不胜感激。

【问题讨论】:

你到底想用这个日期做什么?剥离时区信息?转换为当地时间? 解析到本地日期,是的,在 DateTime 库上它不喜欢 GMT+0000 它似乎只喜欢 GMT 我相信,但也许我错过了一些东西。我肯定需要 2012 之后的一天(7 月 12 日) 谢谢大家的帮助!! 【参考方案1】:

您可以将DateTime.ParseExact 与custom date and time format string 一起使用:

DateTime.ParseExact("Thu Jul 12 08:39:56 GMT+0000 2012", 
                    "ddd MMM dd hh:mm:ss 'GMT'K yyyy",
                    CultureInfo.InvariantCulture)

如果字符串和格式字符串不完全匹配,这将引发格式异常,因此您可能需要使用DateTime.TryParseExact,如果失败将返回false

您可能希望使用保留时区信息的DateTimeOffset 而不是DateTime,因为@Keith commented - 这可能对您的应用程序很重要。

【讨论】:

是的,有时 GMT+0000 会更改为 GMT+0100。如果此应用程序运行时间超过 2012 年,那么 2012 年将发生变化。这是我正在阅读的日期字符串的来源:s3-eu-west-1.amazonaws.com/olympics-outdoor/xml/images.xml @KeithS - 是的,我在测试几个不同的字符串时自己遇到了这个问题,并将GMT 转义为文字。虽然没有冒号,但zzzzK 都处理得很好。 @Oded:甜蜜。好的,好的答案;我建议的唯一另一件事是将其解析为 DateTimeOffset ,它保留指定时区中的时间,而不是将其临时转换为本地或 UTC。 @KeithS 公平点。如果它对 OP 很重要,将添加到我的答案中。 Keith,我正在尝试您的修复,但我不确定如何逃避 GMT,我将 @ 放在整个字符串的前面以使其变得乱七八糟,但它仍然在抱怨:DateTime convertDate = DateTime.ParseExact( datetest3, @"ddd MMM dd HH:MM:SS 'GMT'zzzz yyyy", System.Globalization.CultureInfo.InvariantCulture);【参考方案2】:

您可以做两件事:首先,您应该能够使用来自 DateTime 或 DateTimeOffset 的自定义格式字符串和 ParseExact 方法(如果戳的实际时区很重要,我会使用 DateTimeOffset,而不仅仅是UTC 或您当地时区的等效时间)。

看看:DateTime custom format string

格式字符串可能类似于@"ddd MMM dd HH:mm:ss 'GMT'zzzz yyyy"

但是,有一个障碍; .NET 时区偏移(“zzzz”或简称“K”)在表示为字符串时总是在小时和分钟之间包含一个冒号,而您的输入字符串没有。我无法指定时区偏移量没有/不应该有这个冒号,而且我很确定尝试在没有冒号的情况下解析它会导致错误。

最简单的解决方法是在解析之前从字符串中删除该特定冒号。给定您输入的代码只是删除字符串中的最后一个冒号字符:

var updatedString = inputString.Remove(inputString.LastIndexOf(':'), 1);

【讨论】:

【参考方案3】:

尝试DateTime.Parse 方法来解析您的日期。

【讨论】:

使用 OP 所说的示例不起作用,我得到:“字符串未被识别为有效的 DateTime。”与香草DateTime.Parse. DateTime.Parse 失败,给出的字符串...见我上面的 cmets,2012 年需要在 7 月 12 日之后,而不是在最后。似乎在他的字符串中的任何地方都不喜欢 GMT+0000。【参考方案4】:

这应该可行:

XmlConvert.ToDateTime(textBox1.Text, "ddd MMM dd HH:mm:ss 'GMT'zzzz yyyy");

【讨论】:

以上是关于从字符串解析 DateTime 时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

日期转换(用DateTime的ParseExact方法解析特殊的日期时间)(转)

解析 API 响应时遇到意外字符

读取sqlite数据库时用SQLiteDataAdapter填充Datatable时遇到的问题。

Json.net 从 HTTPClient 结果反序列化 DateTime

TSQL:从字符串转换日期和/或时间时转换失败

在 OSX Mojave 上安装 DateTime 时遇到问题