来自webservice的日期转换问题

我正在使用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 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对象转换为另一个时区。

由于隐藏的“第4种” ,您可以安全地从本地转换回UTC而不会产生歧义。 (与原始值的偏移将消除歧义。)

据我所知,没有办法让它来创建一个DateTimeOffset 。 那将是理想的。 但是,如果你真的想深入了解,你可能会完全忽略偏移 – 虽然这不一定是最好的主意。

此外,值得一提的是,如果您尝试创建自己的服务并直接公开DateTimeOffset类型,则会遇到问题。 没有从DateTimeOffsetxsd:dateTime或SOAP使用的任何其他XML Schema数据类型的映射。 相反,您在架构中获得自定义复杂类型,并且数据根本不会传递。 在客户端上,您将获得一个根本不执行任何操作的YourServiceReference.DateTimeOffset对象,而不是接收System.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);