.net 服务客户端日期时区偏移量兼容性问题

.net 服务客户端日期时区偏移量兼容性问题,.net,datetime,service,wcf-client,.net,Datetime,Service,Wcf Client,我正试图使用Visual Studio服务引用(System.ServiceModel命名空间类),通过.NET应用程序与Java Web服务通信。我发现,每当序列化DateTime值时,它都不会指定偏移量。问题有两个方面: 我不知道如何创建具有特定时区的DateTime对象。我可以创建一个DateTimeOffset来实现这一点,但是服务客户端需要一个DateTime对象 序列化DateTime对象时,它不包括时区偏移量 为了详细说明问题#2,服务希望timestamp对象使用的XML如下所示

我正试图使用Visual Studio服务引用(System.ServiceModel命名空间类),通过.NET应用程序与Java Web服务通信。我发现,每当序列化DateTime值时,它都不会指定偏移量。问题有两个方面:

  • 我不知道如何创建具有特定时区的DateTime对象。我可以创建一个DateTimeOffset来实现这一点,但是服务客户端需要一个DateTime对象
  • 序列化DateTime对象时,它不包括时区偏移量
  • 为了详细说明问题#2,服务希望timestamp对象使用的XML如下所示:

      <startDate>2011-03-18T00:00:00-07:00</startDate>
      <endDate>2011-03-19T00:00:00-07:00</endDate>
    
      <startDate>2011-03-18T00:00:00</startDate>
      <endDate>2011-03-19T00:00:00</endDate>
    
    2011-03-18T00:00:00-07:00
    2011-03-19T00:00:00-07:00
    
    但是,我在跟踪.NET应用程序时看到的XML如下所示:

      <startDate>2011-03-18T00:00:00-07:00</startDate>
      <endDate>2011-03-19T00:00:00-07:00</endDate>
    
      <startDate>2011-03-18T00:00:00</startDate>
      <endDate>2011-03-19T00:00:00</endDate>
    
    2011-03-18T00:00:00
    2011-03-19T00:00:00
    

    web服务需要时区,因为基础数据是在GMT-0中跟踪的。返回的数据是以每天为间隔的,因此如果我没有指定时区,那么我将返回GMT-0的数据。只有在查询中提供偏移量时,我才能获得正确时区中的数据。

    建议:将所有DateTimeOffset值转换为UTC中的DateTime值,并将其提交到webapp

    static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) {
       if (dateTime.Offset.Equals(TimeSpan.Zero))
          return dateTime.UtcDateTime;
       else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
          return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
       else
          return dateTime.DateTime;
    }
    
    从本页:


    希望这有帮助。

    建议:将所有DateTimeOffset值转换为UTC的DateTime值,并将其提交到webapp

    static DateTime ConvertFromDateTimeOffset(DateTimeOffset dateTime) {
       if (dateTime.Offset.Equals(TimeSpan.Zero))
          return dateTime.UtcDateTime;
       else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
          return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
       else
          return dateTime.DateTime;
    }
    
    从本页:

    希望这有帮助