Первый вопрос, который вы должны задать себе: что я пытаюсь сделать?Преобразовать GregorianCalendar и XMLGregorianCalendar очень просто:
GregorianCalendar gc;
XMLGregorianCalendar xc;
gc = xc.toGregorianCalendar();
xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
Но это, похоже, не является ядром вашей проблемы.Вы пытаетесь выполнить преобразование часового пояса?ИМХО, это можно сделать проще, если вы перенесете преобразование на время отображения (поскольку это действительно проблема форматирования), воспользуетесь тем фактом, что и GregorianCalendar, и XMLGregorianCalendar несут с собой информацию о часовом поясе и избавятся от двух вспомогательных классов..
TimeZone cet = TimeZone.getTimeZone("CET");
TimeZone utc = TimeZone.getTimeZone("UTC");
GregorianCalendar gc = new GregorianCalendar();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss Z");
@Test
public void testNow() throws DatatypeConfigurationException {
df.setTimeZone(gc.getTimeZone());
log.info(" - Gregorian LOCAL [" + df.format(gc.getTime()) + "]");
df.setTimeZone(cet);
log.info(" - Gregorian CET [" + df.format(gc.getTime()) + "]");
df.setTimeZone(utc);
String gcs = df.format(gc.getTime());
log.info(" - Gregorian UTC [" + df.format(gc.getTime()) + "]");
XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
df.setTimeZone(xc.getTimeZone(0));
log.info(" - XML RAW [" + df.format(xc.toGregorianCalendar().getTime()) + "]");
df.setTimeZone(cet);
log.info(" - XML CET [" + df.format(xc.toGregorianCalendar().getTime()) + "]");
df.setTimeZone(utc);
String xcs = df.format(xc.toGregorianCalendar().getTime());
log.info(" - XML UTC [" + df.format(xc.toGregorianCalendar().getTime()) + "]");
assertEquals(gcs, xcs);
}
Или, возможно, ваша проблема на самом деле заключается в очистке входных данных.Я вижу, что у вас есть переменная вылета и времени, предположительно для рейсов из аэропортов по всему миру, и вы, вероятно, получаете их из какого-либо источника данных, который не имеет явной информации о часовом поясе, а вместо этого предполагает "местное время в аэропорту".Это объяснило бы вспомогательные классы, но в этом случае вы должны очистить свой ввод там, где это происходит.Определить «местное время в аэропорту» иногда бывает сложно (страна может выбрать переход с летнего времени на стандартное через неделю в следующем году или вообще отменить летнее время, а аэропорт, например, может даже переключать часовые пояса в США).перемещение округов с востока на центр и обратно происходит чаще, чем вы думаете).Вы должны использовать базу данных Locale вашего компьютера, чтобы решить эту проблему, и избегать попыток использовать собственную арифметику часовых поясов.