Webサービスへの送信にXMLGregorianCalendar
形式の日付を使用したい。 Webサービスは、yyyy-dd-mm
フォーマット。以下のコードを使用してXMLGregorianCalendar
を作成し、Webサービスに送信します。
Date dob = null;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
XMLGregorianCalendar date2;
dob = df.parse("13/06/1983");
GregorianCalendar c = new GregorianCalendar();
c.setTimeInMillis(dob.getTime());
date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
System.out.println(date2);
}
catch(DatatypeConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch(ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
残念ながら、日付は常に1983-06-13T00:00:00.000-04:00
。時間も出力に含まれています。日付だけを取得することは可能ですか?手伝っていただけませんか?
「SimpleDateFormat」を指定する必要はありません、簡単です:表示したくない場所に定数「DatatypeConstants.FIELD_UNDEFINED」を指定する必要があります
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(new Date());
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
そうだね...
Date dob=null;
DateFormat df=new SimpleDateFormat("dd/MM/yyyy");
dob=df.parse( "13/06/1983" );
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dob);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendarDate(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH)+1, cal.get(Calendar.DAY_OF_MONTH), DatatypeConstants.FIELD_UNDEFINED);
これにより、正しい形式で表示されます。
すべてのパラメーターを個別に渡さずに、SimpleDateFormatのみを使用する方がはるかに簡単です。
String FORMATER = "yyyy-MM-dd'T'HH:mm:ss'Z'";
DateFormat format = new SimpleDateFormat(FORMATER);
Date date = new Date();
XMLGregorianCalendar gDateFormatted =
DatatypeFactory.newInstance().newXMLGregorianCalendar(format.format(date));
完全な例 こちら 。
注:これは、最後の2つのフィールド(ミリ秒とタイムゾーン)を削除するか、フォーマッターyyyy-MM-dd
を使用して時間コンポーネント全体を削除する場合にのみ機能します。
理想的な変換は実際にはありませんが、いくつかのオプションを提供したいと思います。
Java.time
最初に、日付を解析および保持するために、Java.timeのLocalDate
を使用する必要があります。これは、最新のJava日付と時刻API)です。Date
およびSimpleDateFormat
には設計上の問題があり、長く古くなっているため、特に後者は面倒です。
_ 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);
_
文字列を使用する必要も、個々のフィールドを渡す必要もないので、変換自体が好きです(正しい順序で行うよう注意してください)。気に入らないのは、時刻とタイムゾーンオフセットを渡してから、それらのフィールドを手動で消去する必要があるということです。
これは、どのフォーマットでも簡単な方法です。必要なフォーマット文字列に変更するだけです
XMLGregorianCalendar gregFmt = DatatypeFactory.newInstance().newXMLGregorianCalendar(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss").format(new Date()));
System.out.println(gregFmt);