私はこの関数を書きました:
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:00
と2014-01-06T18:30:00Z
のみを取得する場合の対処方法
ご協力をお願いします
以下のように解決策を見つけました....他の誰かにも役立つ可能性があるので投稿してください:)
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
私にとって最もエレガントなソリューションはこれです:
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
GregorianCalendar c = GregorianCalendar.from((LocalDate.parse("2016-06-22")).atStartOfDay(ZoneId.systemDefault()));
XMLGregorianCalendar date2 = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
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クラスに取って代わられた古い面倒な日時クラスを使用しています。
入力文字列"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 8以降に組み込まれています。これらのクラスは、面倒な古い legacy のような日時クラスに取って代わります- Java.util.Date
、 Calendar
、& SimpleDateFormat
。
Joda-Time プロジェクトは、現在 メンテナンスモード であり、 Java.time クラスへの移行を推奨しています。
詳細については、 Oracle Tutorial を参照してください。また、多くの例と説明についてはStack Overflowを検索してください。指定は JSR 31 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、Java.timeを追加のクラスで拡張します。このプロジェクトは、Java.timeに将来追加される可能性のある証明の場です。 Interval
、 YearWeek
、 YearQuarter
などの便利なクラスがあります。 、および more 。