Java 如何正确添加';Z';在';由SpringMVC和JAXB进行编组?
我有一个DateTimeXmlAdapter,用于将Joda日期转换为字符串。情况如下: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
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
是已知时区与未知时区的对比。见这个问题:
我建议不要将JodaDateTime
转换为String
,而是转换为xmlgreeliancalendar
,后者对时区等字段更为详细。然后,JAXB将负责XMLGregorianCalendar
编组(或解编组)
见:
javax.xml.datatype.DatatypeFactory.newInstance()
-将javax.xml.datatype.DatatypeFactory.newXMLGregoriacalendar(年、月、日、小时、分钟、秒、毫秒、时区)
Z的最后一个设置为
0
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);
}
}