来自web服务的日期转换问题
本文关键字:转换 问题 日期 web 服务 来自 | 更新日期: 2023-09-27 18:09:05
我正在使用一个Web服务,它将在响应对象中返回日期时间字段。
我的reference.cs文件有
private System.DateTime timestampField;
public System.DateTime Timestamp {
get {
return this.timestampField;
}
set {
this.timestampField = value;
}
}
在SOAP UI中,当我调用服务时,我看到它返回为2014-06-09T21:24:56+00:00
, 2014-06-17T05:42:00-04:00
我对不同的值有不同的偏移量…
但是从我的。net应用程序,当我调用它转换为一些其他的值作为6/9/2014 5:24:56 PM
,但它应该是其实际值是6/9/2014 9:24 pm
。
我该如何解决这个问题?
当您使用使用xsd:dateTime
的SOAP web服务时,Visual Studio将始终使用DateTime
创建客户端代理类。
-
如果数据中没有偏移,则值将与
DateTimeKind.Unspecified
一致 -
如果发送的不是偏移量,而是
Z
说明符,则值将通过DateTimeKind.Utc
传递。 -
如果有任何偏移,则值通过
DateTimeKind.Local
。即使偏移量为零。无论偏移量是什么,它都会被应用,然后将该值转换为本地时间。实际上,它在内部调用.ToLocalTime()
。
这有点糟糕,但最简单的处理方法是使用.ToUniversalTime()
转换回UTC,或使用TimeZoneInfo
对象转换到另一个时区。
由于隐藏的"第四种",您可以安全地从本地转换回UTC而不会产生歧义。(与原始值的偏移量将消除歧义。)
据我所知,没有办法让它创建一个DateTimeOffset
代替。那将是理想的。然而,如果你真的想深入研究,你可以让它完全忽略偏移量——尽管这不一定是最好的主意。
另外,值得一提的是,如果您试图创建自己的服务并直接公开DateTimeOffset
类型—您将遇到问题。没有从DateTimeOffset
到xsd:dateTime
或SOAP使用的任何其他XML Schema数据类型的映射。相反,您将在模式中获得自定义的复杂类型,而数据根本不会传递下去。在客户机上,您得到的不是System.DateTimeOffset
,而是一个根本不做任何事情的YourServiceReference.DateTimeOffset
对象。这很不幸,因为应该是在面向公众的API中使用DateTimeOffset
的好建议,但它根本不起作用。至少对SOAP/XML来说不是这样。在REST/JSON的世界里,情况要好得多。
这就是我所做的,不确定这是否是有效的方法。
我对不同的时间值有不同的偏移值,我不知道从时间字段值的时区…我所做的是
我将时间字段值转换为字符串,并使用子字符串获得偏移量,并将其应用于时间字段值
的UTC TimeSpan offSetSpan = new TimeSpan();
string dt = TimestampValue;
string offset = TimestampValue.Substring(trackevent.Timestamp.Length - 6,6);
if (offset != "+00:00" && offset != "-00:00")
{
offSetSpan = TimeSpan.Parse(offset.Trim());
}
Console.WriteLine("Offset Timestamp: {0}", Convert.ToDateTime(TimestampValue).ToUniversalTime() + offSetSpan);