如何从ISO 8601格式创建.NET DateTime

时间:2010-08-24 11:56:54

标签: c# .net datetime iso8601 datetime-parsing

我已经找到了如何将DateTime转换为ISO 8601格式,但没有提到如何在C#中进行反向操作。

我有2010-08-20T15:00:00Z,我想把它变成DateTime对象。

我可以自己分离字符串的各个部分,但这对于已经是国际标准的东西来说似乎很多工作。

7 个答案:

答案 0 :(得分:122)

此解决方案使用DateTimeStyles枚举,它也适用于Z。

DateTime d2 = DateTime.Parse("2010-08-20T15:00:00Z", null, System.Globalization.DateTimeStyles.RoundtripKind);

完美打印解决方案。

答案 1 :(得分:25)

虽然MSDN说“s”和“o”格式反映了标准,但它们似乎只能解析它的有限子集。特别是如果字符串包含时区规范,则会出现问题。 (它既不适用于基本的ISO8601格式,也不适用于降低精度格式 - 但这并不是你的情况。)这就是为什么我在解析ISO8601时使用自定义格式字符串。目前我首选的代码段是:

static readonly string[] formats = { 
    // Basic formats
    "yyyyMMddTHHmmsszzz",
    "yyyyMMddTHHmmsszz",
    "yyyyMMddTHHmmssZ",
    // Extended formats
    "yyyy-MM-ddTHH:mm:sszzz",
    "yyyy-MM-ddTHH:mm:sszz",
    "yyyy-MM-ddTHH:mm:ssZ",
    // All of the above with reduced accuracy
    "yyyyMMddTHHmmzzz",
    "yyyyMMddTHHmmzz",
    "yyyyMMddTHHmmZ",
    "yyyy-MM-ddTHH:mmzzz",
    "yyyy-MM-ddTHH:mmzz",
    "yyyy-MM-ddTHH:mmZ",
    // Accuracy reduced to hours
    "yyyyMMddTHHzzz",
    "yyyyMMddTHHzz",
    "yyyyMMddTHHZ",
    "yyyy-MM-ddTHHzzz",
    "yyyy-MM-ddTHHzz",
    "yyyy-MM-ddTHHZ"
    };

public static DateTime ParseISO8601String ( string str )
{
    return DateTime.ParseExact ( str, formats, 
        CultureInfo.InvariantCulture, DateTimeStyles.None );
}

如果你不介意解析TZ-less字符串(我这样做),你可以添加一个“s”行来大大扩展所涵盖的格式更改的数量。

答案 2 :(得分:21)

using System.Globalization;

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00",
    "s",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, out d);

答案 3 :(得分:16)

这是一个更适合我的工作(LINQPad版本):

DateTime d;
DateTime.TryParseExact(
    "2010-08-20T15:00:00Z",
    @"yyyy-MM-dd\THH:mm:ss\Z",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AssumeUniversal, 
    out d);
d.ToString()

产生

true
8/20/2010 8:00:00 AM

答案 4 :(得分:5)

TryParseExact的ISO字符串格式完全匹配似乎很重要。我猜Exact是精确的,这个答案对大多数人来说是显而易见的,但无论如何......

在我的情况下,Reb.Cabin的答案不起作用,因为根据我的“价值”,我的输入略有不同。

价值:2012-08-10T14:00:00.000Z

在那里有一些额外的000秒,可能还有更多。

但是,如果我在格式中添加一些.fff,如下所示,一切都很好。

格式字符串:@"yyyy-MM-dd\THH:mm:ss.fff\Z"

在VS2010立即窗口中:

DateTime.TryParseExact(value,@"yyyy-MM-dd\THH:mm:ss.fff\Z", CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal, out d);

是真的

您可能还必须使用DateTimeStyles.AssumeLocal,具体取决于您的时间区域...

答案 5 :(得分:3)

这在LINQPad4中运行良好:

Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00Z"));
Console.WriteLine(DateTime.Parse("2010-08-20T15:00:00"));
Console.WriteLine(DateTime.Parse("2010-08-20 15:00:00"));

答案 6 :(得分:-1)

DateTime.ParseExact(...)允许您告诉解析器每个字符代表什么。