【问题标题】:Axis web service datetime to java calendarAxis Web服务日期时间到Java日历
【发布时间】:2011-08-25 01:17:37
【问题描述】:

我注意到,当使用 java 和轴时,wsdl 日期时间会转换为具有本地机器时区信息的日历对象。我的情况是,我需要知道在 datetime 字段中传递的 GMT 偏移量,但似乎它正在使用某种 DateFormat 来解析它成为将其标准化为 GMT 时间的日期,然后将其转换到具有本地机器时区的日历对象。是否有一种简单的方法可以将日历对象设置为发送过来的 WSDL XML 字段中指定的 TimeZone GMT 偏移量?或者有没有一种方法可以让我自己访问该字符串字段来进行自己的解析?

谢谢, BBB

【问题讨论】:

    标签: java web-services axis


    【解决方案1】:

    我不确定这是否正确。 我的情况是,我从网络服务获取日期时间,Axis 将其转换为日历,比从网络服务收到的值多 1 小时。

    例如:

       2015-11-19T12:00:00 from webservice
    
       2015-11-19T13:00:00 got from parsed Axis object
    

    c.get(Calendar.ZONE_OFFSET) = 3600000

    您可以简单地创建具有正确日期时间的日期:

    Date correctDate = new Date(c.getTime().getTime() - c.get(Calendar.ZONE_OFFSET));
    

    【讨论】:

      【解决方案2】:

      我也遇到过类似的问题,但它总是是因为我一直在对返回的 Calendar 对象使用 getTime(),然后在其上使用日期格式化程序。问题出在 getTime() 方法中。

      如果您直接查询日历对象,您可以获得与 Web 服务发送信息完全相同的信息。

      具体围绕时区,假设 Calendar 对象是 c。

      c.get(Calendar.ZONE_OFFSET)
      

      将以毫秒为单位为您提供时区偏移量。然后,您可以根据需要使用该值

      下面是我用于我的案例的代码,我需要将它恢复为 xsd:datetime 格式的字符串。毫无疑问,有更好的方法来编写它,所以如果有人读到它并可以改进代码,我将不胜感激。

      public String calendarToXsdDateTimeString(Calendar c){
              StringBuffer outputStringBuffer = new StringBuffer();
              //2011-08-22T11:21:57
              outputStringBuffer.append(c.get(Calendar.YEAR));
              outputStringBuffer.append("-");
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.MONTH)+1));
              outputStringBuffer.append("-");
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.DAY_OF_MONTH)));
              outputStringBuffer.append("T");
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.HOUR_OF_DAY)));
              outputStringBuffer.append(":");
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.MINUTE)));
              outputStringBuffer.append(":");
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.SECOND)));
              outputStringBuffer.append(getTimeZoneFromCalendar(c));
              return outputStringBuffer.toString();
          }
      
          public String prefixZeroIfRequired(int value){
              if(value<10 && value >=0){
                  return "0"+value;
              }
              else if(value <0 && value > -10){
                  String s = value+"";
                  String s1 = s.charAt(0)+"0"+s.charAt(1);
                  return s1;
              }
              else{
                  return ""+value;
              }
      
          }
      
          private String getTimeZoneFromCalendar(Calendar c){
              StringBuffer outputStringBuffer = new StringBuffer();
              if(c.get(Calendar.ZONE_OFFSET) >= 0){
                  outputStringBuffer.append("+");
              }
              outputStringBuffer.append(prefixZeroIfRequired(c.get(Calendar.ZONE_OFFSET)/1000/60/60));
              outputStringBuffer.append(":"+Math.abs(c.get(Calendar.ZONE_OFFSET)/1000/60)%60);
              return outputStringBuffer.toString();
          }
      

      【讨论】:

      • 这个返回的 Calendar 对象中不断包含本地时区。这导致我猜测轴是如何进行转换的。来自 web 服务的 XML 具有事件发生的时区,但是当我检查日历对象轴时,它只显示本地时区。
      • @bitramp 你如何获得时区?如果你检查我上面的代码,你会注意到我没有使用 getTimeZone(),我从 ZONE_OffSET 计算时区
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 1970-01-01
      • 1970-01-01
      • 2017-04-25
      相关资源
      最近更新 更多