我有一个 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);
}
}
这会在 XML 中产生以下字符串:
2014-10-16T18:31:57-0400
但是,我发送此消息的端点期望末尾是“Z”而不是-0400。他们建议转换为 UTC,这样就不需要发送时区信息。我感觉合理。然而,除非我按字面意思表述,否则我似乎无法在结尾处加上“Z”。如:
private static final String PATTERN = "yyyy-MM-dd'T'HH:mm:ss'Z'";
下面的讨论似乎表明不建议添加 Z。
Validating Timestamp format yyyy-MM-dd'T'HH:mm:ssZ in java?
它尝试将其更改为以下内容,但这会导致日期没有“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);
}
}
输出:
2014-10-17T18:50:43
我正在交谈的端点说他们需要“Z”,因为它表示与 UTC 的零偏移。使用 Joda Time 和 JAXB 时,在末尾添加“Z”的正确方法是什么?
谢谢
马特
最佳答案
使用方法ISODateTimeFormat.dateHourMinuteSecond()不合适,因为它不输出偏移量(在您的情况下,这是 Z = UTC+00:00)。相反,您可以使用方法 dateTimeNoMillis() ,当然您需要将 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);
}
}
来自文档:
Returns a formatter that combines a full date and time without millis, separated by a 'T' (yyyy-MM-dd'T'HH:mm:ssZZ). The time zone offset is 'Z' for zero, and of the form '±HH:mm' for non-zero.
关于java - 如何在 Spring MVC 使用 JAXB 编码的日期时间末尾正确添加 'Z'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26433779/