Дата и время веб-службы Axis в Java-календаре - PullRequest
0 голосов
/ 25 августа 2011

Я заметил, что дата-время wsdl при использовании java и axis преобразуется в объект Calendar с информацией о часовом поясе локального компьютера. Я нахожусь в ситуации, когда мне нужно знать смещение по Гринвичу, которое передается в поле даты и времени, но кажется, что он использует какой-то тип DateFormat для анализа, который становится датой, которая нормализует его по времени GMT, а затем преобразовывает его в объект календаря с часовым поясом локальной машины. Есть ли простой способ получить объект календаря со смещением TimeZone GMT, указанным в отправляемом поле WSDL XML? Или я могу получить доступ к этому строковому полю самостоятельно, чтобы выполнить собственный анализ?

Спасибо, В

Ответы [ 2 ]

1 голос
/ 19 ноября 2015

Я не уверен, что это правильно.В моем случае я получаю дату и время от веб-службы, а 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));
0 голосов
/ 30 августа 2011

Я сталкивался с похожими проблемами, но всегда был, потому что я использовал getTime () для возвращенного объекта Calendar, а затем использовал для него средство форматирования даты. Проблема заключается в методе getTime ().

Если вы напрямую запросите объект Calendar, вы сможете получить информацию именно так, как ее отправляет веб-служба.

Конкретно вокруг часового пояса, предполагая, что объект 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();
    }
...