Java 通过XML解析器动态地将ZonedDateTime字符串映射到LocalDateTime
我有一个XML响应字符串,如下所示:Java 通过XML解析器动态地将ZonedDateTime字符串映射到LocalDateTime,java,xml,jaxb,timestamp,zoneddatetime,Java,Xml,Jaxb,Timestamp,Zoneddatetime,我有一个XML响应字符串,如下所示: 55.5 我通过JAXB和注释将其映射为: public class Timestamp { @XmlAttribute(name = "ts") private String timeStampAsString; @XmlValue private Double value; 它可以正常工作,但是我想从字符串自动解析日期时间,所以我的理想解决方案应该是 public class Timestamp { @XmlA
55.5
我通过JAXB
和注释将其映射为:
public class Timestamp {
@XmlAttribute(name = "ts")
private String timeStampAsString;
@XmlValue
private Double value;
它可以正常工作,但是我想从字符串
自动解析日期时间
,所以我的理想解决方案应该是
public class Timestamp {
@XmlAttribute(name = "ts")
private LocalDateTime timeStampAsLocalDateTime;
@XmlValue
private Double value;
我知道我可以借助以下工具解析字符串:
ZonedDateTime.parse(zonedDateTimeAsString).toLocalDateTime();
但是我不确定是否有一种方法可以动态解析这个
这可以通过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
中已经提到的,可能会有问题,OffsetDateTime
或Instant
可能更合适。这种方法也一样,只需替换类和解析逻辑即可)在大多数情况下,LocalDateTime
是时间戳的糟糕选择,因为在将时间戳用作时间点之前,您需要在时区或UTC偏移量中对其进行解释,这很容易出错(最多)。请考虑一个<代码>即时<代码>或另一个类,它本身定义了一个时间点。“on the飞翔”是什么意思?应该将您的<代码> TS 字符串解析为<代码> OffStaseDeTimeTime//Cord>对象。
@XmlAttribute(name="ts")
@XmlJavaTypeAdapter(LocalDateTimeAdapter.class)
private LocalDateTime timeStampAsLocalDateTime;