Axis Web服务日期时间到java日历

时间:2011-08-25 01:17:37

标签: java web-services axis

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

谢谢, BBB

2 个答案:

答案 0 :(得分:1)

如果这是正确的话,我不是真的。 我的情况是,我从Web服务获取日期时间,Axis将其转换为日历,其时间比从Web服务收到的值多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));

答案 1 :(得分:0)

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

如果直接询问Calendar对象,您可以获得与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();
    }