【问题标题】:XMLGregorianCalendar to Date in oracleOracle 中的 XMLGregorianCalendar 到日期
【发布时间】:2019-02-04 02:36:51
【问题描述】:

我得到了从文件中读取的 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;
}

当我保存它们而不是获取第一、第二和第三个小时时,我得到:

我在这里阅读了很多类似问题的答案,但我仍然无法正确回答,因为我得到了奇怪的结果,比如第一、第三、第三个小时等等。 我应该在转换器中进行哪些更改才能使其正常工作?

【问题讨论】:

  • 那些输入字符串不是“XMLGregorianCalendar 日期”。它们是标准 ISO 8601 格式的文本。 java.time 类在解析/生成日期时间值的文本表示时默认使用这些标准格式。 Instant.parse( "2018-03-25T01:00:00Z" )
  • 我知道我可以将它转换为 Instant,但我需要将它保存在 oracle 11g 数据库中,当我尝试保存它时,我会收到类似“二进制或数字预期”的 oracle 错误。当我将它保存为 java.util.Date 时,它​​可以工作,但是没有将默认时区设置为 UTC,我遇到了小时数问题

标签: java oracle hibernate xmlgregoriancalendar


【解决方案1】:

好的,我通过添加解决了它

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

在我从 toDate 方法返回 java.util.Date 之前。

【讨论】:

  • 这是一个糟糕的解决方案。设置默认时区会立即影响在该 JVM 中运行的所有应用程序的所有线程中的所有代码。相反,使用 java.time 类并指定其他可选的时区参数。
  • 这是一个非常小的应用程序,它就是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-25
  • 2018-12-14
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-08-22
  • 1970-01-01
相关资源
最近更新 更多