Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自webservice的日期转换问题_C#_Web Services_Datetime_Proxy Classes - Fatal编程技术网

C# 来自webservice的日期转换问题

C# 来自webservice的日期转换问题,c#,web-services,datetime,proxy-classes,C#,Web Services,Datetime,Proxy Classes,我正在使用一个Web服务,它将在响应对象中返回datetime字段 我的reference.cs文件 private System.DateTime timestampField; public System.DateTime Timestamp { get { return this.timestampField; } set { this.timestampField = value; } } 在SOAP UI中,当我调用该

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


如何修复此问题?

当您使用使用
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模式数据类型的映射。相反,您在模式中得到了一个自定义的复杂类型,并且数据根本不会传递。在客户机上,不是接收
System.DateTimeOffset
,而是得到一个根本不做任何事情的
YourServiceReference.DateTimeOffset
对象。不幸的是,在面向公众的API中使用
DateTimeOffset
应该是一个很好的建议,但它根本不起作用。至少不适用于SOAP/XML。REST/JSON世界的情况要好得多。

当您使用使用
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模式数据类型的映射。相反,您在模式中得到了一个自定义的复杂类型,并且数据根本不会传递。在客户机上,不是接收
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);

我就是这么做的,不确定这是不是有效的方法

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

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

你是如何看待价值的?我的猜测是,它只是将它从UTC转换为您的本地时间。你能改用
DateTimeOffset
吗?>@JonSkeet我用SOAP用户界面查看响应。结尾的+00:00显示它返回的是UTC时间。您看到的“转换”值是在本地时间。您所说的“SOAPUI”到底是什么意思?我更多的是询问“来自我的.NET应用”部分。。。例如,您正在调用
DateTime.ToString()
?@JonSke