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

Ste*_*son 15 .net c# datetime iso8601

有这个SOAP Web服务以下列格式向我发送datetime对象

2016-03-29T12:20:35.093-05:00
Run Code Online (Sandbox Code Playgroud)

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

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

DateTime.Now
Run Code Online (Sandbox Code Playgroud)

并获得上述格式的字符串表示以及逆操作,从上面给出的字符串创建一个DateTime.

我已经尝试了以下内容来创建日期:

new DateTime(2016, 3, 29, 12, 20, 35, 093, DateTimeKind.Utc)
Run Code Online (Sandbox Code Playgroud)

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

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

使用Nate的代码我正在做以下事情:

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

FormatIso8601(d)
Run Code Online (Sandbox Code Playgroud)

然而,这个电话正在回复:"2016-03-29T15:20:35Z"而不是:

"2016-03-29T12:20:35.093-03:00"
Run Code Online (Sandbox Code Playgroud)

这是我真正需要的.

我认为这有效:

        d.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz")
Run Code Online (Sandbox Code Playgroud)

Nat*_*ini 24

您描述的格式是ISO 8601.

由于您正在处理包含时区组件的时间戳,因此我强烈建议您使用DateTimeOffset而不是DateTime.它让事情变得如此简单!

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

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

此代码将格式化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);
}
Run Code Online (Sandbox Code Playgroud)

并且,将字符串解析为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);
}
Run Code Online (Sandbox Code Playgroud)

如果你必须回到a,DateTime你可以从中得到这个DateTimeOffset.UtcDateTime属性.


Mik*_*sen 15

一种更简单的方法是使用DateTimeOffset上的ToString方法和"o"参数.这将自动以ISO8601格式打印日期

DateTimeOffset.Now.ToString("o");
Run Code Online (Sandbox Code Playgroud)

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

DateTimeOffset.Parse("2016-25-12T20:45:30.3124+01:00");
DateTimeOffset.Parse("2016-25-12T20:45:30.3124Z");
Run Code Online (Sandbox Code Playgroud)