如何解析和生成 ISO 8601 格式的 DateTime 对象

How to parse and generate DateTime objects in ISO 8601 format

这个 SOAP Web 服务以下列格式向我发送日期时间对象

2016-03-29T12:20:35.093-05:00

即 2016 年 3 月 29 日。时间:12:20:35.093 (GMT-5).

我希望能够创建一个 DateTime 对象,如下所示:

DateTime.Now

并获取上述格式的字符串表示形式以及逆运算,从上面给出的字符串创建 DateTime。

我尝试了以下方法来创建日期:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)

但是,我不知道如何在那里指定 GMT-5...

我也不知道如何将 DateTime 转换为指定的字符串格式。

使用 Nate 的代码,我正在执行以下操作:

var d = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-3));

FormatIso8601(d)

但是此调用返回:“2016-03-29T15:20:35Z”而不是:

"2016-03-29T12:20:35.093-03:00"

这才是我真正需要的。

我认为这可行:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")

您描述的格式是 ISO 8601

由于您使用的时间戳包含时区部分,我强烈建议您使用 DateTimeOffset 而不是 DateTime。它让事情变得简单多了!

要为给定的日期、时间和时区偏移量创建 DateTimeOffset,请使用以下语法:

var date = new DateTimeOffset(2016, 3, 29, 12, 20, 35, 93, TimeSpan.FromHours(-5));
// March 29, 2016 at 12:20:35.93 GMT-5

此代码会将 DateTimeOffset 格式化为 ISO 8601:

public static string FormatIso8601(DateTimeOffset dto)
{
    string format = dto.Offset == TimeSpan.Zero
        ? "yyyy-MM-ddTHH:mm:ss.fffZ"
        : "yyyy-MM-ddTHH:mm:ss.fffzzz";

    return dto.ToString(format, CultureInfo.InvariantCulture);
}

并且,将字符串解析回 DateTimeOffset:

public static DateTimeOffset ParseIso8601(string iso8601String)
{
    return DateTimeOffset.ParseExact(
        iso8601String,
        new string[] { "yyyy-MM-dd'T'HH:mm:ss.FFFK" },
        CultureInfo.InvariantCulture,
        DateTimeStyles.None);
}

如果你必须回到 DateTime 你可以从 DateTimeOffset.UtcDateTime 属性.

一种更简单的方法是在 DateTimeOffset 上使用带有 "o" 参数的 ToString 方法。这会自动以 ISO8601 格式打印日期

DateTimeOffset.Now.ToString("o");

静态解析方法也能够正确解析 ISO8601 格式的日期。

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");

简单回答:DateTime.UtcNow.ToString("o")