有这个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")
答案 0 :(得分:24)
您描述的格式为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
属性获取此信息。
答案 1 :(得分:14)
更简单的方法是在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");
答案 2 :(得分:0)
简单回答:DateTime.UtcNow.ToString("o")