java - 设置 xs :datetime type from java setter method omits milliseconds part of timestamp value

标签 java datetime jaxb timestamp milliseconds

我使用 JAXB 从 xsd 模式生成了 java 模式对象。

我想做的是使用 java 模式对象 setter 方法设置 xml 标记的值,然后编码 java 对象。但在生成的最终 xml 中,我发现为 xs:datetime 类型生成的时间戳没有毫秒。

我期望看到像“2013-06-28T01:20:50.000-04:00”这样的日期,我得到的只是“2013-06-28T01: 20:50-04:00”,没有毫秒。

二传手调用

obj.setTransactionDateTime(getTimestamp("2013-06-28 01:20:50"));

获取时间戳方法

public Calendar getTimestamp(String dateStr)
{
    Date returnDate = null;

    if(dateStr == null)
    {
        return null;
    }       

    try
    {
        SimpleDateFormat srcFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");            
        Date date = srcFormatter.parse(dateStr);        

        SimpleDateFormat destFormatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");    
        returnDate = destFormatter.parse(destFormatter.format(date));           
    }
    catch (ParseException e)
    {
        dbacc.logError("Error while parsing date string" + e.getMessage());
    }       

    Calendar cal = Calendar.getInstance();
    cal.setTime(returnDate);

    return cal;
}

日期时间类型的绑定(bind)定义如下...

<jxb:javaType name="java.util.Calendar" xmlType="xsd:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime"/>

不确定代码有什么问题。非常感谢任何帮助。

最佳答案

默认行为

编码 java.util.Date 时,如果它们不是 0,JAXB 实现将编码它们。

Java 模型(根)

import java.util.Date;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlType(propOrder = { "foo", "bar" })
public class Root {

    private Date foo;
    private Date bar;

    public Date getFoo() {
        return foo;
    }

    public void setFoo(Date foo) {
        this.foo = foo;
    }

    public Date getBar() {
        return bar;
    }

    public void setBar(Date bar) {
        this.bar = bar;
    }

}

演示

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setFoo(DatatypeConverter.parseDateTime("2013-08-02T11:50:00-04:00").getTime());
        root.setBar(DatatypeConverter.parseDateTime("2013-08-02T11:50:00.123-04:00").getTime());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<root>
    <foo>2013-08-02T11:50:00-04:00</foo>
    <bar>2013-08-02T11:50:00.123-04:00</bar>
</root>

强制使用 XmlAdapter 编码毫秒数

您可以创建一个 XmlAdapter 来控制 java.util.Date 的编码方式:

从 XML 架构启动时利用 XmlAdapter

下面是我给出的答案的链接,演示了在从 XML 架构生成模型时如何利用 XmlAdapter

关于java - 设置 xs :datetime type from java setter method omits milliseconds part of timestamp value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18020614/

相关文章:

java - 同一属性上的 @JsonIgnore 和 @JsonProperty

java - 组合两个不同按钮的输出

python - 如何在 pandas resample().mean() 和 resample().sum() 时禁用 nans 计算?

java - 如何在 stub 生成期间重命名 WSDL 中的复杂类型

java - 调试 Java 代码时如何使用 Scanner 类对象设置变量的值?

java - 如何在java或linux命令行中计算一组数字的90%分布值?

javascript - DateTime 和 DateTimeZone 的奇怪行为

scala - 在 Scala/Spark 中将纪元转换为日期时间

java - 使用 JAXB 根​​据属性将 XML 解码为不同的对象

java - 在相同情况下 @XmlJavaTypeAdapter 被忽略