我正在使用一个Web服务,它将返回响应对象中的datetime字段。
我的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
。
我该如何解决这个问题?
答案 0 :(得分:4)
当您使用使用xsd:dateTime
的SOAP Web服务时,Visual Studio将始终使用DateTime
创建客户端代理类。
如果数据中没有偏移量,则DateTimeKind.Unspecified
会显示这些值。
如果不是偏移量,而是发送Z
说明符,那么值将通过DateTimeKind.Utc
传递。
如果有任何偏移,那么值DateTimeKind.Local
就会出现。 即使偏移量为零。无论偏移是什么,都应用它,然后将值转换为本地时间。基本上,它在内部调用.ToLocalTime()
。
这种情况很糟糕,但处理它的最简单方法是使用.ToUniversalTime()
转换回UTC,或使用TimeZoneInfo
对象转换为其他时区。
感谢hidden "4th kind",您可以安全地从本地转换回UTC而不会产生歧义。 (与原始值的偏移将消除歧义。)
据我所知,没有办法让它来创建DateTimeOffset
。那将是理想的。但是,如果你真的想深入了解,你可能会把它带到ignore the offset completely - 虽然这不一定是最好的主意。
此外,值得一提的是,如果您尝试创建自己的服务并直接公开DateTimeOffset
类型,则会遇到问题。没有从DateTimeOffset
返回到xsd:dateTime
或SOAP使用的任何其他XML Schema数据类型的映射。相反,您在架构中获得自定义复杂类型,并且数据根本不会传递。在客户端上,您不会收到System.DateTimeOffset
,而是获得一个根本不执行任何操作的YourServiceReference.DateTimeOffset
对象。这很不幸,因为它应该是在面向公众的API中使用DateTimeOffset
的好建议,但它根本不起作用。至少不适用于SOAP / XML。 REST / JSON世界中的事情要好得多。
答案 1 :(得分:0)
这就是我所做的,不确定它是否是有效的方式..
我对不同的时间值有不同的偏移值,我不知道时间字段值的时区...我做的是
我将时间字段值转换为字符串并使用子字符串获取偏移量并将其应用于时间字段值的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);