Ошибка преобразования Java XMLGregorianCalendar в утилиту Java. Дата? - PullRequest
2 голосов
/ 26 ноября 2010

Я записываю значение даты / времени в файл XML, считывая дату из пользовательского интерфейса на основе RAP в виде объекта Java Date и передавая его как объект XMLGregorianCalendar в реальный код записи файла.Соответствующие классы генерируются автоматически, и я не могу их контролировать.Дата, которую я ввел, была:

03-03-1933: 03: 03: 03.

При записи в файл она была преобразована в следующую строку:

1933-03-03T03: 03: 03.161 + 05: 53

Теперь, когда я читаю дату назад, чтобы показать ее в пользовательском интерфейсе для редактирования, она появилась тамкак:

03-03-1933: 03: 03: 23

Обратите внимание на дополнительные 20 секунд, добавленные к фактическому значению секунд.

Почемуэто происходит?Это какая-то ошибка в API?Любая помощь будет высоко ценится!

Соответствующий код:

1) Преобразование в XMLGregorianCalendar из Date:

GregorianCalendar calendar = new GregorianCalendar(); 
calendar.setTimeInMillis(date.getTime());
XMLGregorianCalendar date2;
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(calendar);

// pass 'date2' to file writing code

2) Преобразование в Dateот XMLGregorianCalendar:

XMLGregorianCalendar cal = getDateFromFile(); // XML date read from file
Date date = cal.toGregorianCalendar().getTime();

// show Date object in UI, dateCtrl and timeCtrl are SWT DateTime objects

GregorianCalendar calendar = new GregorianCalendar();  
calendar.setTime( date );

dateCtrl.setDate( calendar.get( GregorianCalendar.YEAR ),
    calendar.get( GregorianCalendar.MONTH ),
    calendar.get( GregorianCalendar.DAY_OF_MONTH ) );

timeCtrl.setTime( calendar.get( GregorianCalendar.HOUR_OF_DAY ),
    calendar.get( GregorianCalendar.MINUTE ),
    calendar.get( GregorianCalendar.SECOND) );

1 Ответ

2 голосов
/ 29 ноября 2010

Примерно до 1968 года существовали всевозможные странные отклонения, особенно в менее развитых частях мира.Вы не говорите, какую локаль вы используете, но если это в Индии, когда-то было что-то под названием Howra Mean Time, которое имело это смещение.Однако я не знаю, действовал ли он в 1933 году.Скорее всего, вам придется загрузить базу данных tz для вашей локали и проверить конфигурацию на эту дату.

РЕДАКТИРОВАТЬ: Чтобы точно проверить, что происходит, попробуйте:

GregorianCalendar c = new GregorianCalendar();
TimeZone tz = c.getTimeZone();
System.out.println(tz);

int tzo = tz.getOffset(date.getTime());
System.out.println(
      tzo/3600000 + ":" + 
      (tzo/60000)%60 + ":" + 
      (tzo/1000)%60 + "." + 
      tzo%1000);

Это скажет вам, что система считает текущим часовым поясом, и смещение часового пояса, действующее на проблемную дату в 1933 году. Когда я запускаю это в своей системе, я получаю:

sun.util.calendar.ZoneInfo[id="America/Chicago",offset=-21600000,dstSavings=3600000,useDaylight=true,transitions=235,lastRule=java.util.SimpleTimeZone[id=America/Chicago,offset=-21600000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=3,startMonth=2,startDay=8,startDayOfWeek=1,startTime=7200000,startTimeMode=0,endMode=3,endMonth=10,endDay=1,endDayOfWeek=1,endTime=7200000,endTimeMode=0]]
-6:0:0.0

ОДНАКО, еслиЯ меняю одну строку:

GregorianCalendar c = new GregorianCalendar(TimeZone.getTimeZone("IST"));

Затем получаю:

sun.util.calendar.ZoneInfo[id="IST",offset=19800000,dstSavings=0,useDaylight=false,transitions=6,lastRule=null]
5:53:20.0
...