Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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 如何正确添加';Z';在';由SpringMVC和JAXB进行编组?_Java_Xml_Jaxb_Jodatime - Fatal编程技术网

Java 如何正确添加';Z';在';由SpringMVC和JAXB进行编组?

Java 如何正确添加';Z';在';由SpringMVC和JAXB进行编组?,java,xml,jaxb,jodatime,Java,Xml,Jaxb,Jodatime,我有一个DateTimeXmlAdapter,用于将Joda日期转换为字符串。情况如下: public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> { private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ"; private static final DateTimeFormatter formatter = DateT

我有一个DateTimeXmlAdapter,用于将Joda日期转换为字符串。情况如下:

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> {
    private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ssZ";
    private static final DateTimeFormatter formatter = DateTimeFormat.forPattern(PATTERN);

    @Override
    public DateTime unmarshal(String value) {
        return formatter.parseDateTime(value);
    }

    @Override
    public String marshal(DateTime value) {
        return formatter.print(value);
    }
}
但是,我将此消息发送到的端点期望在结尾处出现“Z”,而不是-0400。他们建议转换为UTC,这样就不需要发送时区信息。对我来说有道理。然而,除非我说得很清楚,否则我似乎无法得到一个“Z”的结尾。例如:

private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
下面的讨论似乎表明不建议添加Z

它尝试将其更改为以下内容,但这会导致一个不带“Z”的日期

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> {
    private static final DateTimeFormatter formatter = ISODateTimeFormat.dateHourMinuteSecond().withZoneUTC();

    @Override
    public DateTime unmarshal(String value) {
        return formatter.parseDateTime(value);
    }

    @Override
    public String marshal(DateTime value) {
        return formatter.print(value);
    }
}
我正在谈论的端点表示他们需要“Z”,因为它表示与UTC的偏移量为零。使用Joda Time和JAXB时,在末尾添加“Z”的正确方法是什么

谢谢


Matt

Z
与不带
Z
是已知时区与未知时区的对比。见这个问题:

我建议不要将Joda
DateTime
转换为
String
,而是转换为
xmlgreeliancalendar
,后者对时区等字段更为详细。然后,JAXB将负责
XMLGregorianCalendar
编组(或解编组)

见:

  • javax.xml.datatype.DatatypeFactory.newInstance()
  • javax.xml.datatype.DatatypeFactory.newXMLGregoriacalendar(年、月、日、小时、分钟、秒、毫秒、时区)
    -将
    Z的最后一个设置为
    0
使用该方法是不合适的,因为它不输出偏移量(在您的情况下是Z=UTC+00:00)。相反,您可以使用该方法,当然您需要将
DateTime
-对象更改为UTC偏移量:

public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> {
    private static final DateTimeFormatter formatter = 
        ISODateTimeFormat.dateTimeNoMillis().withZoneUTC();

    @Override
    public DateTime unmarshal(String value) {
        return formatter.parseDateTime(value);
    }

    @Override
    public String marshal(DateTime value) {
        return formatter.print(value);
    }
}
公共类DateTimeXmlAdapter扩展XmlAdapter{
专用静态最终DateTimeFormatter格式化程序=
ISODateTimeFormat.dateTimeNoMillis().withZoneUTC();
@凌驾
公共日期时间解组(字符串值){
返回格式化程序.parseDateTime(值);
}
@凌驾
公共字符串封送处理(日期时间值){
返回格式化程序。打印(值);
}
}
来自文档:

返回一个组合完整日期和时间(不带毫秒)的格式化程序, 由“T”分隔(yyyy-MM-dd'T'HH:MM:ssZZ)。时区偏移为 “Z”表示零,形式为“±HH:mm”表示非零

2014-10-17T18:50:43
public class DateTimeXmlAdapter extends XmlAdapter<String, DateTime> {
    private static final DateTimeFormatter formatter = 
        ISODateTimeFormat.dateTimeNoMillis().withZoneUTC();

    @Override
    public DateTime unmarshal(String value) {
        return formatter.parseDateTime(value);
    }

    @Override
    public String marshal(DateTime value) {
        return formatter.print(value);
    }
}