来自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

我该如何解决这个问题?

来自web服务的日期转换问题

当您使用使用xsd:dateTime的SOAP web服务时,Visual Studio将始终使用DateTime创建客户端代理类。

  • 如果数据中没有偏移,则值将与DateTimeKind.Unspecified一致

  • 如果发送的不是偏移量,而是Z说明符,则值将通过DateTimeKind.Utc传递。

  • 如果有任何偏移,则值通过DateTimeKind.Local即使偏移量为零。无论偏移量是什么,它都会被应用,然后将该值转换为本地时间。实际上,它在内部调用.ToLocalTime()

这有点糟糕,但最简单的处理方法是使用.ToUniversalTime()转换回UTC,或使用TimeZoneInfo对象转换到另一个时区。

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

据我所知,没有办法让它创建一个DateTimeOffset代替。那将是理想的。然而,如果你真的想深入研究,你可以让它完全忽略偏移量——尽管这不一定是最好的主意。

另外,值得一提的是,如果您试图创建自己的服务并直接公开DateTimeOffset类型—您将遇到问题。没有从DateTimeOffsetxsd: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);