理想的な変換は実際にはありませんが、いくつかのオプションを提供したいと思います。
java.time
まず、LocalDate
日付を解析して保持するために、Java の最新の日付と時刻の API である java.time を使用する必要があります。Date
andSimpleDateFormat
は設計上の問題があり、時代遅れであるため、避けてください。特に後者は厄介なことで有名です。
DateTimeFormatter originalDateFormatter = DateTimeFormatter.ofPattern("dd/MM/uuuu");
String dateString = "13/06/1983";
LocalDate date = LocalDate.parse(dateString, originalDateFormatter);
System.out.println(date);
出力は次のとおりです。
1983-06-13
さらに先に進む必要がありますか?LocalDate.toString()
あなたが尋ねたフォーマットを生成します。
フォーマットと解析
XMLGregorianCalendar
変換するための最初の簡単なオプションが必要であると仮定すると、次のようになります。
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(date.toString());
System.out.println(xmlDate);
1983-06-13
文字列にフォーマットして解析するのはもったいない気がしますが、先ほども言ったように簡単で、結果が期待どおりであっても驚くことはないと思います。
年月日を個別に渡す
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendarDate(date.getYear(), date.getMonthValue(),
date.getDayOfMonth(), DatatypeConstants.FIELD_UNDEFINED);
結果は以前と同じです。タイム ゾーン オフセットが不要であることを明示する必要があります (これがDatatypeConstants.FIELD_UNDEFINED
指定内容です)。念のために言っておきますが、 と は人間と同じように月LocalDate
をXMLGregorianCalendar
数えるので、1 を足したり引いたりすることはありません。
GregorianCalendar による変換
このオプションを紹介するのは、これが正式な方法であると考えているLocalDate
ためです。ZonedDateTime
GregorianCalendar
XMLGregorianCalendar
ZonedDateTime dateTime = date.atStartOfDay(ZoneOffset.UTC);
GregorianCalendar gregCal = GregorianCalendar.from(dateTime);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance()
.newXMLGregorianCalendar(gregCal);
xmlDate.setTime(DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED,
DatatypeConstants.FIELD_UNDEFINED, DatatypeConstants.FIELD_UNDEFINED);
xmlDate.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
文字列を使用する必要も、個々のフィールドを渡す必要もないため、変換自体が気に入っています (正しい順序で行うように注意してください)。私が気に入らないのは、時刻とタイム ゾーン オフセットを渡してから、後でこれらのフィールドを手動で消去する必要があることです。