【问题标题】:Parsing ISO 8601 with timezone to .NET datetime将带时区的 ISO 8601 解析为 .NET 日期时间
【发布时间】:2013-07-25 11:54:33
【问题描述】:
我有一个ISO 8601 时间戳,格式为:
YYYY-MM-DDThh:mm:ss[.nnnnnnn][{+|-}hh:mm]
YYYY-MM-DDThh:mm:ss[{+|-}hh:mm]
例子:
2013-07-03T02:16:03.000+01:00
2013-07-03T02:16:03+01:00
如何将其解析为提供正确 TimeZone 的 .NET Framework DateTime?
DateTime.TryParse 不起作用,因为有关 TimeZone 的尾随信息。
【问题讨论】:
标签:
c#
.net
datetime
iso8601
【解决方案1】:
您应该能够使用DateTimeOffset 和K custom format specifier 对其进行格式化。然后,您可以根据需要将其转换为 DateTime。示例代码:
using System;
using System.Globalization;
class Test
{
static void Main()
{
string text = "2013-07-03T02:16:03.000+01:00";
string pattern = "yyyy-MM-dd'T'HH:mm:ss.FFFK";
DateTimeOffset dto = DateTimeOffset.ParseExact
(text, pattern, CultureInfo.InvariantCulture);
Console.WriteLine(dto);
}
}
需要注意的一点是,它的名字很糟糕——它实际上不是一个时区,它只是一个 UTC 偏移量。它不实际上告诉您原始时区。 (可以有多个不同的时区同时观察相同的偏移量。)
或者Noda Time(不稳定的版本,很快就会变成1.2):
string text = "2013-07-03T02:16:03.000+01:00";
OffsetDateTimePattern pattern = OffsetDateTimePattern.ExtendedIsoPattern;
OffsetDateTime odt = pattern.Parse(text).Value;
Console.WriteLine(odt);