Строка для XMLGregorianCalendar проблема

1

Я пытаюсь преобразовать из строки в XML-григорианскую дату календаря и всегда возвращать мне новый экземпляр. Пожалуйста, проверьте мой код ниже

Дата ввода :: 2014-03-13 15:34:33 +0000

Желаемая Дата выхода :: 2014-03-13 15:34:33 +0000

Но когда я конвертирую, используя мой код ниже, выдается 2014-03-13T11: 34: 33.000-04: 00

   public static void convertXMLGregorian() throws DatatypeConfigurationException {
    TimeZone utc = TimeZone.getTimeZone("UTC");
    GregorianCalendar gc = new GregorianCalendar();

    SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
    XMLGregorianCalendar xc=DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
    String xcs = df.format(xc.toGregorianCalendar().getTime());        

    XMLGregorianCalendar converted = stringToXMLGregorianCalendar(xcs, df); 
    System.out.println("converted " + converted);
 // output :: 2014-03-13T11:34:33.000-04:00


// String conversion methods 

private static XMLGregorianCalendar dateToXMLGregorianCalendar(Date date) {

    try {

        GregorianCalendar gc = (GregorianCalendar) GregorianCalendar
                .getInstance();

        gc.setTime(date);

        return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);

    } catch (DatatypeConfigurationException e) {

        System.out.print(e.getMessage());

        return null;

    }

}


private static XMLGregorianCalendar stringToXMLGregorianCalendar(
        String datetime, SimpleDateFormat sdf) {

    try {

        Date date = sdf.parse(datetime);

        return dateToXMLGregorianCalendar(date);

    } catch (ParseException e) {

        System.out.print(e.getMessage());

        return null;

    }

Пожалуйста, помогите, спасибо заранее.

Теги:
string
date
gregorian-calendar

2 ответа

3

См. Ниже, почему существующий код не работает для вас, и обходной путь. Однако, чтобы сохранить смещение UTC и сделать все это намного проще, я подозреваю, что вы просто хотите использовать DatatypeFactory.newXMLGregorianCalendar(String):

// This replaces *all* of the code in the question
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime);

Единственная муха в мазе здесь заключается в том, что она выглядит так, как будто ваш вход не имеет T в нем, тогда как каноническое представление XML делает. Это легко фиксируется:

// The only place you've got a space is exactly where you want a T.
datetime = datetime.replace(' ', 'T');
XMLGregorianCalendar result = DatatypeFactory.newInstance().newXMLGregorianCalendar(datetime);

Оригинальный ответ

Я подозреваю, что это проблема:

GregorianCalendar gc = (GregorianCalendar) GregorianCalendar.getInstance();

Это создаст календарь в часовом поясе по умолчанию.

Если вы всегда хотите иметь UTC смещение 0, просто используйте:

gc.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));

Если вы пытаетесь сохранить смещение UTC в исходном тексте, это другое дело - вы не можете сделать это с помощью вашего текущего подхода, потому что Date не поддерживает эту информацию. (Это просто мгновение.)

В стороне я бы настоятельно рекомендовал изменить стратегию обработки исключений - просто вернуть null и продолжить, как будто все было хорошо, редко бывает хорошей идеей. Как правило, лучше подумать о том, чтобы исключить распространение или обернуть его в более подходящий тип исключения (возможно, исключение во время выполнения).

  • 0
    это сработало как шарм, спасибо, а также есть ли у вас какие-либо предложения по сохранению смещения, 2007-10-31T05: 00: 00.000Z - это вывод, который я получил после изменения, есть ли способ изменить его на что-то вроде 2014-03 -13T11: 34: 33.000-04: 00 и сохранить смещение.
  • 0
    @ user3288434: Я только что нашел, что, как я подозреваю, было бы намного, намного лучшим вариантом - редактировать это в ответ сейчас.
Показать ещё 8 комментариев
0
System.out.println("converted " + converted);

Это будет использовать преобразованный метод toString(). Вы можете использовать здесь SimpleDateFormat?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню