如何正确解析 DateTime 字符串

How to properly parse DateTime string

我有输入日期时间字符串,如下所示:2015-01-28 17:55:43。问题是它们处于 UTC+8(或其他一些班次)。无论软件运行的时区如何,我都需要将这些字符串正确解析和处理为 UTC。 我的问题是 DateTime.Parse returns 本地时间,而不是 UTC 时间,而且我没有看到在解析字符串时指定 shift 的方法。 我目前对此的解决方案如下所示:

add.LastUpdatedTime = new DateTime((DateTime.Parse(text) - new TimeSpan(0, 8, 0, 0)).Ticks,DateTimeKind.Utc);

这很丑陋,我不确定它是否适用于所有情况。

有更好的方法吗?

鉴于您有本地时间和偏移量,我建议在 DateTimeOffset 中表示它。所以:

DateTime localTime = DateTime.ParseExact(...);
DateTimeOffset offsetTime = new DateTimeOffset(localTime, offset);

那么你仍然知道当地时间,但你可以在需要时获得等效的 UTC。基本上它会保留您拥有的所有信息。

作为替代方案,您可以使用 Noda Time,它代表 OffsetDateTime 中的相同信息。您将使用 LocalDateTimePattern 将值解析为 LocalDateTime,然后使用 WithOffset 方法转换为适当的 OffsetDateTime.

编写示例程序,输出如下:

Console.WriteLine(DateTime.Now.ToString("o"));

查看该格式,并将其用作修补传入字符串时间的模板。有关更多可行的字符串选项,请查看 DateTime.ToString Method ...我敢打赌那里有一些变体将为您解决(例如,使用末尾带有 "zzz" 的格式,这将生成本地时间的 UTC 偏移量,例如 "HH:mm:ss.ffffzzz",如链接页面所示)。

另请查看示例中的 DateTime.Parse Method ...请注意字符串“2008-09-15T09:30:41.7752486-07:00”,其中包含 -7 的 UTC 偏移量(America/Denver ) 表示对解析有效。