asp.net-mvc – delphi web服务从.net mvc应用程序获取不同的日期时间

我知道大多数人建议的解决方案是将我的对象的属性从TDateTime更改为String,但我无法访问Web服务应用程序的所有源代码,因此有些情况下我无法做到这一点.所以我宁愿确保我处理这个问题.

简而言之,我有一个.NET MVC应用程序,它调用Delphi 2005编写的服务应用程序的Web方法来获取约会对象,包括开始日期/时间和结束日期/时间.用户可以更改约会,然后MVC应用程序调用另一个Web方法,传入修改的约会对象,以便服务应用程序存储.

TAppointemnt的StartTime和EndTime属性在Delphi中定义为TDateTime.它们在WSDL中显示为xs:dateTime. Visual Studio在Reference.cs中将它们创建为System.DateTime.

通过在Delphi中使用Web App Debugger,并将MVC应用程序的端点设置为Web服务EXE,我可以实时浏览这两个应用程序.我所看到的是,当从Web服务传递到.NET MVC时,发送和接收的约会对象的StartTime和EndTime属性是相同的,但是当从.NET MVC传递到Delphi时,时间调整了13个小时网络服务.

虽然我理解.NET会进行一些内部时区调整,但只有当客户端和服务器位于不同的时区时才会显而易见.就我而言,客户端浏览器,.NET MVC应用程序和Delphi服务应用程序都在同一个应用程序中.事实上,它们都在同一台机器上运行,所以我不知道为什么会出现差异.

看起来他们用不同的方式用XML编码日期时间……

从Delphi服务应用程序到.NET MVC应用程序的响应:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00.000+13:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00.000+13:00</EndTime>

从.NET MVC应用程序到Delphi服务应用程序的POST:

<StartTime xsi:type="xsd:dateTime">2012-10-29T08:00:00</StartTime><EndTime xsi:type="xsd:dateTime">2012-10-29T09:15:00</EndTime>
最佳答案
我发现了一个适合我的解决方案.

在我的模型中,我处理对约会的更新,我传递了由视图组件生成的约会对象,该对象不包括所有属性.只有那些观点.要完成约会,我从服务应用程序获取未更改的版本,并根据新对象修改其属性.

我在调试时发现,从服务应用程序检索到的wsAppointment的StartTime和EndTime属性具有DateTimeKind为Local,而pAppointment参数的StartTime和EndTime设置为Unspecified.因此,我传回服务应用程序的Local DateTimeKind被Unspecified覆盖.

为了解决这个问题,我使用DateTime.SpecifyKind来显式设置Kind属性,如下所示:

wsAppointment.StartTime = DateTime.SpecifyKind(pAppointment.StartTime, DateTimeKind.Local);
wsAppointment.EndTime = DateTime.SpecifyKind(pAppointment.EndTime, DateTimeKind.Local);

希望这可以帮助遇到相同或类似问题的其他人.

转载注明原文:asp.net-mvc – delphi web服务从.net mvc应用程序获取不同的日期时间 - 代码日志