【问题标题】:java unmarshall LocalDateTimejava解组LocalDateTime
【发布时间】:2015-06-08 02:13:38
【问题描述】:

这是我的适配器类:

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        return new LocalDateTime(v);
    }

    @Override
    public String marshal(LocalDateTime v) throws Exception {
        return v.toString();
    }

}

这是一个对象类,我想在其中存储日期:

    @XmlAccessorType(XmlAccessType.FIELD)
    public class Object {

    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
    private LocalDateTime time;

    public LocalDateTime getTime() {
            return time;
    }

由于某种原因,我无法编译它。它表明问题出在return new LocalDateTime(v);。这是我得到的错误:

Error:(9, 16) java: constructor LocalDateTime in class java.time.LocalDateTime cannot be applied to given types;
      required: java.time.LocalDate,java.time.LocalTime
      found: java.lang.String
      reason: actual and formal argument lists differ in length

和xml部分:

<time type="dateTime">2000-01-01T19:45:00Z</time>

我正在关注this 示例。

【问题讨论】:

  • 这个问题很老了,但我还是会问,为了后代:你确定要使用 LocalDateTime 吗?我问的原因是 XML sn-p 包含时区(“Z”,祖鲁语的缩写,基本上是 GMT 的昵称),而 LocalDateTime 不包含时区信息。我想知道:使用 ZoneDateTime 而不是 LocalDateTime 会更合适吗?

标签: java xml datetime jaxb unmarshalling


【解决方案1】:

您可能正在使用 Java 8 中的 LocalDateTime。此类没有任何字符串构造函数。

在您关注的示例中,LocalDateTime 来自 JodaTime

所以,你可以通过以下方式做到这一点:

  • 导入org.joda.time.LocalDateTime(你需要依赖JodaTime)而不是java.time.LocalDateTime

  • 或将unmarshal 方法更改为这样的:

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        return LocalDateTime.parse(v);
    }
    

您可能需要通知date time format,因为默认格式为2011-12-03T10:15:30,可能是这样的:

@Override
public LocalDateTime unmarshal(String v) throws Exception {
    return LocalDateTime.parse(v, DateTimeFormatter.ISO_INSTANT);
}

另外,java.time.LocalDateTime toString 将输出以下 ISO-8601 格式之一:

  • uuuu-MM-dd'T'HH:mm
  • uuuu-MM-dd'T'HH:mm:ss
  • uuuu-MM-dd'T'HH:mm:ss.SSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSS
  • uuuu-MM-dd'T'HH:mm:ss.SSSSSSSSS

【讨论】:

  • 我想知道,如果我使用return LocalDateTime.parse(v.substring(0,v.length-1));,它也能正常工作.. 那有什么区别呢?
  • 您可以,确保marshalunmarshal 中的模式相同。
  • 顺便说一句,它适用于DateTimeFormatter.ISO_DATE_TIME,但不适用于DateTimeFormatter.ISO_INSTANT。怎么会?
  • 可能会导致输入格式。在 DateTimeFormatter 中,您可以看到此常量的格式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-22
  • 2019-04-23
  • 2020-10-23
  • 2020-03-12
  • 2021-11-26
  • 2015-12-25
相关资源
最近更新 更多