1. ホーム
  2. datetime

[解決済み] JAXBがxsd:dateTimeをマーシャルする際に使用する日付形式はどのように指定するのですか?

2023-03-31 09:08:05

質問

JAXBが日付オブジェクトをマーシャルするとき ( XMLGregorianCalendar ) を xsd:dateTime 要素に変換します。結果のXMLの形式を指定するにはどうしたらよいでしょうか?

例えば デフォルトのデータフォーマットはミリ秒を使用します <StartDate>2012-08-21T13:21:58.000Z</StartDate> ミリ秒を省略したい。 <StartDate>2012-08-21T13:21:58Z</StartDate>

出力形式や日付のフォーマットを指定したいのですが、どうすればよいですか? 私は javax.xml.datatype.DatatypeFactory を作成するために XMLGregorianCalendar オブジェクトを作成します。

XMLGregorianCalendar xmlCal = datatypeFactory.newXMLGregorianCalendar(cal);

どのように解決するのですか?

この場合 XmlAdapter を使って、日付型のXMLへの書き出し方法をカスタマイズすることができます。

package com.example;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class DateAdapter extends XmlAdapter<String, Date> {

    private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Override
    public String marshal(Date v) throws Exception {
        synchronized (dateFormat) {
            return dateFormat.format(v);
        }
    }

    @Override
    public Date unmarshal(String v) throws Exception {
        synchronized (dateFormat) {
            return dateFormat.parse(v);
        }
    }

}

次に @XmlJavaTypeAdapter アノテーションを使って XmlAdapter が特定のフィールドやプロパティに使用されることを指定します。

@XmlElement(name = "timestamp", required = true) 
@XmlJavaTypeAdapter(DateAdapter.class)
protected Date timestamp; 

xjbのバインディングファイルを使用します。

<xjc:javaType name="java.util.Date" xmlType="xs:dateTime"
        adapter="com.example.DateAdapter"/>

とすると、上記のようなアノテーションが生成されます。

(最終的に xjc という名前空間があります。 xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" )