Axis2 — Формат даты

Сценарий

Формат даты, который Axis2 выводит в качестве ответа клиенту веб-службы, имеет следующий формат: «2009-08-28+01:00». Я хотел бы изменить это, чтобы отображать только дату без информации о часовом поясе (например: «2009-08-28»)

Конфигурация

Библиотеки

Ось 2 1.4.1

WSDL

<xsd:element name="StartDate" type="xsd:date" />;

Вопрос

  • Можно ли изменить формат вывода, который используется Axis 2 для записи информации о дате?
  • Видите ли вы какие-либо проблемы для клиентов .NET, связанные с преобразованием этого формата даты?

Ограничения

К сожалению, невозможно изменить элемент StartDate на xsd:string или xsd:token


Уточнение вопроса

Поскольку я использую тип данных XML xsd:date, который определяется как

[-]CCYY-MM-DD[Z|(+|-)hh:mm]

Таким образом, если я установил

Calendar cal = Calendar.getInstance();
cal.setTimeZone(TimeZone.getTimeZone("UTC");
...

тогда вывод выглядит так

2009-01-28Z

Вы можете заменить «UTC» на «GMT» или «».

Могу ли я избавиться от "Z"?


person Dynamicbyte    schedule 28.08.2009    source источник


Ответы (4)


Проблема вызвана использованием объекта Calendar в качестве исходного значения для поля xsd:date. Когда вы получаете экземпляр календаря, он всегда идет с часовым поясом (используется часовой пояс по умолчанию, если он не указан явно). Чтобы удалить часовой пояс, используйте метод clear() и восстановите все поля, кроме часового пояса. Затем библиотека сопоставления XML (я тестировал с помощью XmlBeans, но я думаю, что это верно и для других библиотек связывания, поддерживаемых Axis) генерирует XML без суффикса часового пояса.

Calendar myDate = Calendar.getInstance();   // returns GregorianCalendar
Calendar now = (Calendar)myDate.clone();    // save current timestamp
myDate.clear(); // this clears the fields, including Calendar.ZONE_OFFSET
myDate.set(     //set all fields back from the saved copy
    now.get(Calendar.YEAR),
    now.get(Calendar.MONTH),
    now.get(Calendar.DAY_OF_MONTH),
    now.get(Calendar.HOUR_OF_DAY),
    now.get(Calendar.MINUTE),
    now.get(Calendar.SECOND)
);
person Artem Zankovich    schedule 12.06.2011
comment
Это сводило меня с ума! Спасибо! - person marcolopes; 30.11.2012

У меня была такая же проблема, и можно удалить часовой пояс из дат!

Вы можете использовать созданный вами ConvertUtil.

Сначала вы должны создать класс с вашим настроенным методом/методами преобразования:

public class myConvertUtil extends org.apache.axis2.databinding.utils.ConverterUtil
    {
    public static String convertToString(Date value)
        {
        // return customized Date format
        }
    }

Затем вы должны установить этот класс как SYSTEM_PROPERTY_ADB_CONVERTERUTIL:

String convert_class = "com.firm.myConvertUtil";
System.setProperty(ConverterUtil.SYSTEM_PROPERTY_ADB_CONVERTERUTIL, convert_class);
person Michał Niklas    schedule 30.03.2011
comment
Я столкнулся с той же проблемой и пытаюсь применить вышеуказанное решение, но не работаю для меня. Он не вызывает настроенный ‹conver_class›. Подскажите, пожалуйста, что здесь может быть не так. - person Infotechie; 17.03.2015

Вы не можете.

Его пространство значений описывается как комбинация даты и времени суток в главе 5.4 стандарта ISO 8601. Его лексическое пространство представляет собой расширенный формат:

[-]CCYY-MM-DDThh:mm:ss[Z|(+|-)hh:mm]

Часовой пояс может быть указан как Z (UTC) или (+|-)hh:mm. Часовые пояса, которые не указаны, считаются неопределенными.

http://books.xmlschemata.org/relaxng/ch19-77049.html

Редактировать:

Для справки см. Схема XML, часть 2: Типы данных, второе издание, 3.2.7 dateTime

person Community    schedule 28.08.2009
comment
На самом деле я использую не dateTime, но в принципе вы правы (books. xmlschemata.org/relaxng/ch19-77041.html) - person Dynamicbyte; 28.08.2009
comment
еще один: спецификация даты говорит, что TimeZone является необязательным. ‹quote› Часовые пояса, которые не указаны, считаются неопределенными. - person Dynamicbyte; 28.08.2009
comment
Это возможно! Смотрите мой ответ. - person Michał Niklas; 30.03.2011
comment
Спецификация позволяет указывать часовой пояс необязательно: w3.org/TR/xmlschema-2/#date - person Artem Zankovich; 12.06.2011

Существует метод Calendar#clear, который выполнит то, что вам нужно. Чтобы избавиться от смещения часового пояса, просто сделайте следующее:

cal.clear(Calendar.ZONE_OFFSET);

Обратите внимание, что время без смещения часового пояса неоднозначно. Это оставляет потребителю времени угадывать смещение UTC.

person No Spam    schedule 30.01.2013