【问题标题】:Date Conversion issue from webservice来自网络服务的日期转换问题
【发布时间】:2014-08-07 19:54:25
【问题描述】:

我正在使用一个 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

我该如何解决这个问题?

【问题讨论】:

  • 您如何看待价值?我的猜测是它只是将它从 UTC 转换为您的当地时间。你能用DateTimeOffset代替吗?>
  • @JonSkeet 我使用 SOAP UI 来查看响应..
  • 末尾的 +00:00 表明它正在返回 UTC 时间。您看到的“转换后”值是您的当地时间。
  • “SOAP UI”到底是什么意思?而且我更多地询问“来自我的 .NET 应用程序”部分...例如,您只是打电话给DateTime.ToString() 吗?
  • @JonSkeet SOAP UI 是 Web 服务测试工具——我们可以看到来自服务的响应——en.wikipedia.org/wiki/SoapUI 在 .NET App 中它只是 DateTiem 字段——我只是在查看表单对象class.Timestamp 的值

标签: c# web-services datetime proxy-classes


【解决方案1】:

当您使用使用 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 类型 - 您会遇到问题。没有从DateTimeOffsetxsd:dateTime 或SOAP 使用的任何其他XML Schema 数据类型的映射。相反,您会在架构中获得自定义复杂类型,并且数据根本不会传递。在客户端上,您得到的不是System.DateTimeOffset,而是一个根本不做任何事情的YourServiceReference.DateTimeOffset 对象。很不幸,因为在面向公众的 API 中使用DateTimeOffset应该是很好的建议,但它根本不起作用。至少不是 SOAP/XML。 REST/JSON 世界的情况要好得多。

【讨论】:

    【解决方案2】:

    这是我做的,不知道这是否有效..

    我对不同的时间值有不同的偏移值,我不知道时间字段值的时区......我所做的是

    我将时间字段值转换为字符串并使用子字符串获取偏移量并将其应用于时间字段值的 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);
    

    【讨论】:

    • 如果你在做那个客户端,那么你从子字符串中得到的偏移量就是你自己的 local 偏移量,这不一定是相同的偏移量原始数据。如果您想做到这一点,则必须按照我在答案中链接到的问题所示的复杂路线创建自定义 WCF 格式化程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多