【问题标题】:Map ZonedDateTime String to LocalDateTime by XML Parser on Fly通过 XML Parser on Fly 将 ZonedDateTime 字符串映射到 LocalDateTime
【发布时间】:2020-01-27 12:25:08
【问题描述】:

我有一个 XML 响应字符串: <timestamp ts="2018-12-05T08:00:00+02:00">55.5</timestamp>

我在JAXB 的帮助下将其映射为:

public class Timestamp {
    @XmlAttribute(name = "ts")
    private String timeStampAsString;
    @XmlValue
    private Double value;

它可以正常工作,但我想从String自动解析DateTime,所以我理想的解决方案应该有

public class Timestamp {

    @XmlAttribute(name = "ts")
    private LocalDateTime timeStampAsLocalDateTime;
    @XmlValue
    private Double value;

我知道我可以通过以下方式解析字符串:

ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();

但我不确定是否有办法解析这个on fly

【问题讨论】:

  • 在大多数情况下,LocalDateTime 不是时间戳的最佳选择,因为在将其用作时间点之前,您需要在时区或 UTC 偏移量处对其进行解释,这是错误的-容易(充其量)。请考虑 Instant 或其他本身定义时间点的类。
  • “on Fly”是什么意思?
  • 您的ts 字符串应该被解析为OffsetDateTime 对象。

标签: java xml jaxb timestamp zoneddatetime


【解决方案1】:

这可以通过XmlAdapter 完成。

创建一个扩展 XmlAdapter 的类,将 String 转换为 LocalDateTime

public class LocalDateTimeAdapter extends XmlAdapter<String, LocalDateTime> {

    @Override
    public LocalDateTime unmarshal(String v) throws Exception {
        if (v == null) {
            return null;
        }
        return ZonedDateTime.parse(v).toLocalDateTime();
    }

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

并注释要转换为LocalDateTime的字段:

    @XmlAttribute(name="ts")
    @XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
    private LocalDateTime timeStampAsLocalDateTime;

(正如 cmets 中已经提到的 LocalDateTime 可能有问题,OffsetDateTimeInstant 可能更合适。这种方法将是相同的,只需替换类和解析逻辑)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2012-01-23
    • 2012-08-21
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多