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

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

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 ,可以从DateTimeOffsetUtcDateTime属性。

一种更简单的方法是使用DateTimeOffset上的ToString方法和“o”参数。 这将自动以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")