C# 来自webservice的日期转换问题
我正在使用一个Web服务,它将在响应对象中返回datetime字段 我的reference.cs文件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中,当我调用该
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