Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过XML解析器动态地将ZonedDateTime字符串映射到LocalDateTime_Java_Xml_Jaxb_Timestamp_Zoneddatetime - Fatal编程技术网

Java 通过XML解析器动态地将ZonedDateTime字符串映射到LocalDateTime

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

我有一个XML响应字符串,如下所示:
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;