23

XMLGregorianCalendarWeb サービスに送信するための形式で日付を使用したいと考えています。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。時間も出力に含まれています。日付のみを取得することはできますか?手伝っていただけませんか?

4

5 に答える 5

31

「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);
于 2013-10-18T13:27:42.953 に答える
16

うん、わかった...

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);

これにより、正しい形式になります。

于 2012-12-27T19:36:05.267 に答える
2

理想的な変換は実際にはありませんが、いくつかのオプションを提供したいと思います。

java.time

まず、LocalDate日付を解析して保持するために、Java の最新の日付と時刻の API である java.time を使用する必要があります。DateandSimpleDateFormatは設計上の問題があり、時代遅れであるため、避けてください。特に後者は厄介なことで有名です。

    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指定内容です)。念のために言っておきますが、 と は人間と同じように月LocalDateXMLGregorianCalendar数えるので、1 を足したり引いたりすることはありません。

GregorianCalendar による変換

このオプションを紹介するのは、これが正式な方法であると考えているLocalDateためです。ZonedDateTimeGregorianCalendarXMLGregorianCalendar

    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);

文字列を使用する必要も、個々のフィールドを渡す必要もないため、変換自体が気に入っています (正しい順序で行うように注意してください)。私が気に入らないのは、時刻とタイム ゾーン オフセットを渡してから、後でこれらのフィールドを手動で消去する必要があることです。

于 2019-02-15T11:16:21.167 に答える