Я пытаюсь преобразовать из строки в 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;
}
Пожалуйста, помогите, спасибо заранее.
См. Ниже, почему существующий код не работает для вас, и обходной путь. Однако, чтобы сохранить смещение 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
и продолжить, как будто все было хорошо, редко бывает хорошей идеей. Как правило, лучше подумать о том, чтобы исключить распространение или обернуть его в более подходящий тип исключения (возможно, исключение во время выполнения).
System.out.println("converted " + converted);
Это будет использовать преобразованный метод toString(). Вы можете использовать здесь SimpleDateFormat?