Создание Java-объекта с сериализованным представлением XML boost :: posix_time :: ptime - PullRequest
0 голосов
/ 19 января 2010

У меня есть следующий XML, сгенерированный путем сериализации структуры boost :: posix_time :: ptime. Я хочу создать объект Java Date с этим XML.

<timeStamp class_id="0" tracking_level="0" version="0">
    <ptime_date class_id="1" tracking_level="0" version="0">
        <date>20100119</date>
    </ptime_date>
    <ptime_time_duration class_id="2" tracking_level="0" version="0">
        <time_duration_hours>11</time_duration_hours>
        <time_duration_minutes>53</time_duration_minutes>
        <time_duration_seconds>33</time_duration_seconds>
        <time_duration_fractional_seconds>0</time_duration_fractional_seconds>
    </ptime_time_duration>
</timeStamp>

Ниже приведен код Java, который должен создавать объект Date путем десериализации этого XML. Проблема, с которой я сталкиваюсь, заключается в том, как разбить тег на последовательность год / месяц / день.

Integer date = timeStamp.getPtimeDate().getDate();
Integer hrs = timeStamp.getPtimeTimeDuration().getTimeDurationHours();
Integer mins = timeStamp.getPtimeTimeDuration().getTimeDurationMinutes();
Integer secs = timeStamp.getPtimeTimeDuration().getTimeDurationSeconds();

Calendar cal = Calendar.getInstance();
//TODO
//cal.set(year, month, day, hrs, mins, secs);
Date date = cal.getTime();

Есть подсказки?

EDIT:

Я ищу какое-то элегантное решение, которое не требует преобразования даты в строку и последующего ее разбиения. Это было бы моим последним средством.

Спасибо

1 Ответ

1 голос
/ 19 января 2010

Поскольку вы не хотите использовать String (хотя я настоятельно призываю вас пересмотреть, в конце концов, это то, что есть, и его легче анализировать), я думаю, вы можете сделать обычное старое деление для извлечения деталей.то есть

int tmp = date; // unboxing
int year = tmp / 10000;
int month = (tmp % 10000) / 100;
int day = tmp % 100;

Это тоже не очень элегантно.

Лучший способ справиться с этим - дать указание всем, что вы используете для десериализации, вернуть вам String для * 1008.* вместо Integer.Тогда вы можете просто взять первые четыре символа для вашего, следующие два для месяца и последние два для дня.SimpleDateFormat может сделать тяжелую работу здесь.

...