XMLGregorianCalendar до даты в оракуле - PullRequest
0 голосов
/ 29 августа 2018

Я получил даты XMLGregorianCalendar, которые я прочитал из файла:

<Status status="1028" timestamp="2018-03-25T01:00:00Z"/>
<Status status="1028" timestamp="2018-03-25T02:00:00Z"/>
<Status status="1028" timestamp="2018-03-25T03:00:00Z"/>

Мне нужно хранить их в базе данных Oracle одновременно. Я получил это поле:

<column name="TIMESTAMP" type="DATE"/>

Я получил поле в моей сущности:

@Convert(converter = XMLGregorianCalendarConverter.class)
private XMLGregorianCalendar timestamp;

и мой конвертер:

@Converter
@Slf4j
public class XMLGregorianCalendarConverter implements AttributeConverter<XMLGregorianCalendar, Date> {

    @Override
    public Date convertToDatabaseColumn(XMLGregorianCalendar xcal) {
        return toDate(xcal);
    }

@Override
public XMLGregorianCalendar convertToEntityAttribute(Date date) {
    try {
        return toXMLGregorianCalendarWithUTCTimezone(date);
    } catch (DatatypeConfigurationException e) {
        e.printStackTrace();
    }

    return null;
}

private DatatypeFactory getDatatypeFactory() throws DatatypeConfigurationException {
    return DatatypeFactory.newInstance();
}

private Date toDate(XMLGregorianCalendar calendar) {
    if (calendar == null) {
        return null;
    }

    return calendar.toGregorianCalendar().getTime();
}

private XMLGregorianCalendar toXMLGregorianCalendarWithUTCTimezone(Date date) throws DatatypeConfigurationException {

    if (date == null) {
        return null;
    }

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

    XMLGregorianCalendar xmlGregorianCalendar = getDatatypeFactory().newXMLGregorianCalendar(gregorianCalendar);
    xmlGregorianCalendar.setMillisecond(DatatypeConstants.FIELD_UNDEFINED);
    xmlGregorianCalendar.setTimezone(DatatypeConstants.EQUAL);
    return xmlGregorianCalendar;
}

Когда я сохраняю их, а не получаю первый, второй и третий час, я получаю:

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

1 Ответ

0 голосов
/ 31 августа 2018

Хорошо, я решил, добавив

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

до того, как я верну java.util.Date из метода toDate .

...