C# 日期时间从WebLogic SOAP服务更改为WCF应用程序

C# 日期时间从WebLogic SOAP服务更改为WCF应用程序,c#,wpf,datetime,timezone,weblogic,C#,Wpf,Datetime,Timezone,Weblogic,我来自智利,时区目前设置为GMT-3:00。我的平台配置了以下时区设置: Oracle数据库:GMT-3:00 WebLogic服务器:格林尼治标准时间-3:00 Windows 7客户端:格林尼治标准时间-3:00 执行此查询时,我得到了奇怪的结果: 第一次查询:日期=26/03/08 06:10:00000000000 第二次查询:日期=24/05/13 18:48:00000000000 我可以看到(通过SOAP UI)WebLogic返回以下结果: <S:Envelope xml

我来自智利,时区目前设置为GMT-3:00。我的平台配置了以下时区设置:

Oracle数据库:GMT-3:00

WebLogic服务器:格林尼治标准时间-3:00

Windows 7客户端:格林尼治标准时间-3:00

执行此查询时,我得到了奇怪的结果:

第一次查询:日期=26/03/08 06:10:00000000000

第二次查询:日期=24/05/13 18:48:00000000000

我可以看到(通过SOAP UI)WebLogic返回以下结果:

 <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
   <S:Body>
      <ns2:fobpgGestacionesPorFichaResponse xmlns:ns2="http://nucleo.alemana.cl/">
         <fobpgGestacionesPorFichaResult>
            <gestaciones>
               <controles>7</controles>
               <esGestaTerminada>1</esGestaTerminada>
               <fechaPrimerControl>2007-10-05T00:00:00-03:00</fechaPrimerControl>
               <fechaTermino>2008-03-26T06:10:00-03:00</fechaTermino>
               ..............^ date #1 is here

               <fur>2007-08-05T00:00:00-03:00</fur>
               <furOp>2007-08-05T00:00:00-03:00</furOp>
               <gesdaFechaCreacion>2015-08-19T14:58:41.903-03:00</gesdaFechaCreacion>
               <gesnuIdGesta>45087</gesnuIdGesta>
               <gesnuNroGesta>1</gesnuNroGesta>
               <rnMayorPeso>0</rnMayorPeso>
            </gestaciones>
            <gestaciones>
               <controles>12</controles>
               <esGestaTerminada>1</esGestaTerminada>
               <fechaPrimerControl>2012-10-11T00:00:00-03:00</fechaPrimerControl>
               <fechaTermino>2013-05-24T18:48:00-03:00</fechaTermino>
               ..............^ date #2  is here

               <fur>2012-08-27T00:00:00-03:00</fur>
               <furOp>2012-08-27T00:00:00-03:00</furOp>
               <gesdaFechaCreacion>2015-08-19T14:58:28.071-03:00</gesdaFechaCreacion>
               <gesnuIdGesta>45086</gesnuIdGesta>
               <gesnuNroGesta>2</gesnuNroGesta>
               <rnMayorPeso>1980</rnMayorPeso>
            </gestaciones>
         </fobpgGestacionesPorFichaResult>
      </ns2:fobpgGestacionesPorFichaResponse>
   </S:Body>
</S:Envelope>

7.
1.
2007-10-05T00:00:00-03:00
2008-03-26T06:10:00-03:00
日期在这里
2007-08-05T00:00:00-03:00
2007-08-05T00:00:00-03:00
2015-08-19T14:58:41.903-03:00
45087
1.
0
12
1.
2012-10-11T00:00:00-03:00
2013-05-24T18:48:00-03:00
日期在这里
2012-08-27T00:00:00-03:00
2012-08-27T00:00:00-03:00
2015-08-19T14:58:28.071-03:00
45086
2.
1980
但是,当我的客户端WPF应用程序连接到WebLogic服务并检索上述数据时,我会得到这些值(在调试模式下):

第一次日期回复

这比我预期的(6:10)提前了一个小时(7:10)

第二次日期回复

这是意料之中的(18:48)


我不知道这里发生了什么。为什么这些结果不一致?

我以前有过这个问题,它真的让我困惑。NET根据计算机的时区配置序列化/反序列化XML时,会自动更改
DateTime
值。NET试图提供帮助,但这不是预期的行为,因此往往会引起很多混乱

在任何应用程序中处理
DateTime
的最佳方法是存储UTC日期时间,然后在客户端上以本地格式显示它们

但是,一个不涉及将所有日期时间转换为UTC的更快的解决方案是:

尝试更改
DateTime
s,以便
DateTimeKind
未指定,XML序列化程序将不会尝试转换它们。例如,此代码将日期转换为
DateTimeKind.Unspecified

DateTime newDate = DateTime.SpecifyKind(oldDate, DateTimeKind.Unspecified);

有关详细信息,请参阅上的Microsoft指南。

嗨,F.Rojas,我编辑了您的问题,以清理语法和格式。如果你觉得我改变了你问题的意思,请回过头来。欢迎来到堆栈溢出!SOAP响应看起来是正确的。您是否可以反序列化为
DateTimeOffset
而不是
DateTime
,并检查它认为有哪些时区数据?我在ServiceReference setter中更改System.DateTimeOffset的System.DateTime。所有日期的返回数据如下:01-01-0001 0:00:00+00:00直截了当的猜测:它是否与夏令时有关?2008年,智利的DST一直持续到3月29日。如果您有可能将日期快进,例如4月1日,并查看问题是否仍然存在。是的,从2008年3月26日更改为2008年3月30日时,日期显示正确,这是导致此问题的原因?谢谢