web-dev-qa-db-ja.com

文字列日付からxmlgregoriancalendarへの変換

私はこの関数を書きました:

public static XMLGregorianCalendar getXMLGregorianCalendar(String date) throws OmniException{
    XMLGregorianCalendar xmlCalender=null;
    GregorianCalendar calender = new GregorianCalendar();
    calender.setTime(Util.stringToJavaDate(date));
    xmlCalender = DatatypeFactory.newInstance().newXMLGregorianCalendar(calender);
    return xmlCalender;
}

public static Date  stringToJavaDate(String sDate)  throws OmniException{
    Date date=null;
    date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH).parse(sDate);        
    return date;  
}

日付を"2014-01-07"として渡すと、出力日付が2014-01-06T18:30:00:000Zになります。 2014-01-06T18:30:002014-01-06T18:30:00Zのみを取得する場合の対処方法
ご協力をお願いします

28
JavaStudent

以下のように解決策を見つけました....他の誰かにも役立つ可能性があるので投稿してください:)

DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = format.parse("2014-04-24 11:15:00");

GregorianCalendar cal = new GregorianCalendar();
cal.setTime(date);

XMLGregorianCalendar xmlGregCal =  DatatypeFactory.newInstance().newXMLGregorianCalendar(cal);

System.out.println(xmlGregCal);

出力:

2014-04-24T11:15:00.000 + 02:00

32
JavaStudent

私にとって最もエレガントなソリューションはこれです:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");

Java 8。

拡張例:

XMLGregorianCalendar result = DatatypeFactory.newInstance()
    .newXMLGregorianCalendar("2014-01-07");
System.out.println(result.getDay());
System.out.println(result.getMonth());
System.out.println(result.getYear());

これは印刷されます:

7
1
2014
21
gil.fernandes
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
1
regulus001

tl; dr

LocalDate.parse( "2014-01-07" )
         .atStartOfDay( ZoneId.of( "America/Montreal" ) )
         .format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
         .replace( "T" , " " )

2014-01-07 00:00:00

日時!=文字列

日時値をテキスト表現と混同しないでください。文字列を解析して日時オブジェクトを取得し、日時オブジェクトに値を表す文字列を生成するように依頼します。日時オブジェクトには「フォーマット」はなく、文字列のみにフォーマットがあります。

そのため、思考をモデルとプレゼンテーションという2つの異なるモードにシフトします。適切なタイムゾーンをモデルとして適用し、念頭に置いた日付値を決定します。その値を表示する必要がある場合は、ユーザーが期待する特定の形式で文字列を生成します。

レガシーの日時クラスを避ける

質問とその他の回答はすべて、Java.timeクラスに取って代わられた古い面倒な日時クラスを使用しています。

ISO 8601

入力文字列"2014-01-07"は標準 ISO 8601 形式です。

中央のTは、日付部分と時間部分を分けます。

末尾のZはZuluの略で、 [〜#〜] utc [〜#〜] を意味します。

幸いなことに、Java.timeクラスは、文字列の解析/生成時にデフォルトでISO 8601形式を使用します。したがって、フォーマットパターンを指定する必要はありません。

LocalDate

LocalDate クラスは、時刻とタイムゾーンのない日付のみの値を表します。

LocalDate ld = LocalDate.parse( "2014-01-07" ) ;

ld.toString():2014-01-07

一日の始まりZonedDateTime

その日の最初の瞬間を表示したい場合は、ZoneIdタイムゾーンを指定して、タイムライン上の瞬間を取得するZonedDateTimeを指定します。日付はゾーンごとに世界中で異なるため、タイムゾーンは非常に重要です。パリの真夜中から数分後、フランスはモントリオール・ケベックの「昨日」の新しい日です。

日が00:00:00から始まると決して想定しないでください。夏時間(DST)などの異常は、その日が01:00:00などの別の時刻から始まることを意味します。 Java.timeに最初の瞬間を決定させます。

ZoneId z = ZoneId.of( "America/Montreal" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;

zdt.toString():2014-01-07T00:00:00Z

目的の形式については、事前定義されたフォーマッターを使用して文字列を生成します DateTimeFormatter.ISO_LOCAL_DATE_TIME そして、中央のTをSPACEに置き換えます。

String output = zdt.format( DateTimeFormatter.ISO_LOCAL_DATE_TIME )
                   .replace( "T" , " " ) ; 

2014-01-07 00:00:00


Java.timeについて

Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.DateCalendar 、& SimpleDateFormat

Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。

詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。

Java.timeクラスはどこで入手できますか?

ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 IntervalYearWeekYearQuarter などの便利なクラスがあります。 、および more

0
Basil Bourque