как сохранить дату XMLGregorianCalendar в БД - PullRequest
0 голосов
/ 29 октября 2018

У меня есть сервис SOAP, и этот сервис может получать дату - Date Data Type описание этого типа

enter image description here

У меня также есть класс JAXB, сгенерированный из XSD, и в этом классе присутствует такая дата, как XMLGregorianCalendar:

@XmlAttribute(name = "billDate", required = true)
@XmlSchemaType(name = "date")
protected XMLGregorianCalendar billDate;

Теперь мне нужно сохранить эту дату в базе данных. В БД Oracle у меня есть столбец с типом DATE. В PostgreSQl - TIMESTAMP тип. В сущности:

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "BILL_DATE")
private Date billDate;

Мой вопрос:

Если вы верите документации (и можете верить, как я проверял), тогда я могу отправить дату в следующих форматах: 2002-09-24 или 2002-09-24Z или 2002-09-24+06:00. Без часового пояса и с часовым поясом. Теперь мне нужно сохранить эту дату в БД и после этого мне нужно восстановить ее из БД в правильном формате (с часовым поясом или без). Когда я сохраняю его в БД, я использую этот метод конвертации:

public static java.util.Date asDate(XMLGregorianCalendar xgc) {
        if (xgc == null) {
            return null;
        } else {
            return xgc.toGregorianCalendar().getTime();
        }
    }

И после этого сохранить java.util.Date. Но когда я выбираю эту дату и конвертирую в XMLGregorianCalendar - я получаю дату с часовым поясом:

private static DatatypeFactory df = null;

    static {
        try {
            df = DatatypeFactory.newInstance();
        } catch (DatatypeConfigurationException dce) {
            throw new IllegalStateException("Exception while obtaining DatatypeFactory instance", dce);
        }
    }


    public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) {
        if (date == null) {
            return null;
        } else {
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTimeInMillis(date.getTime());
            return df.newXMLGregorianCalendar(gc);
        }
    }

поэтому, когда я получил дату: 2002-09-24 сохраните ее в БД, выберите из БД и конвертируйте в XMLGregorianCalendar - у меня есть 2002-09-24+03:00 Но мне нужно 2002-09-24. И если я получу дату 2002-09-24+03:00, мне нужно 2002-09-24+03:00.

...