java - 如何在 Spring MVC 使用 JAXB 编码的日期时间末尾正确添加 'Z'?

标签 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 = 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/

相关文章:

java - 亚马逊 EC2 和 jbossws

java - 成功编码后无法解码\u0000

java - JAXB - xsd :all 内具有无限 maxOccurs 的元素

java - jackson :防止序列化通过序列化 HashMap 获得的json字符串

java - 如何反转java中linkedhashmap中存储的 key

java - 使用 j2ee 容器身份验证时,如何以编程方式 'login' 用户基于 'remember me' cookie?

xml - 从不同的文档 xslt 2.0 复制时命名空间问题

java - 无法在具有 <DOCTYPE> 标记的 XML 文件中从 JAVA 运行 Xpath 查询

java - 如何在SAX解析器中获取文件名?

java - 在上传到 Google App Engine 之前如何打包我的类(class)