1

残りのサービスから XMLGregorianCalendar を取得しています。言語に応じて月をローカライズする必要があります。日付をローカライズする最善の方法は、SimpleDateFormat クラスを使用することだと読みました。問題は、XMLGregorianCalendar を SimpleDateFormat に変換する方法がわからないことです。キャストが機能せず、最も近いXMLGregorianCalendar.toGregorianCalendar.getTime() のは Date を返すものですが、Date を SimpleDateFormat 型に変換する方法が見つかりません。何か案は?

-編集- SimpleDateFormat が好きな理由は、ISO 639-1 コードのリスト ( http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes ) を使用できるためです。これは、コンテキストから取得したものです。

4

2 に答える 2

3

そんなことはできません。文字列から日付を解析し、日付を文字列にフォーマットSimpleDateFormatできるオブジェクトです。しかし、特定の時点の意味を持つデータを保持するオブジェクトは、まったく別のものです。Date

SimpleDateFormatただし、日付を文字列に変換するために使用できます。

SimpleDateFormat sdf  = new SimpleDateFormat("YYYY-MMM-dd", myLocaleInstance);
System.out.println(sdf.format(myXMLGregorianCalendarInstance));

書式文字列を組み立てて、Localeインスタンスを取得するだけです (たとえば、言語コードから)。

経験則

  • デフォルトの Locale に依存することは、悪いトラブルを意味する可能性があります! (ここでは関係ありませんが、同じことがデフォルトのエンコーディングにも当てはまります)
  • Dateにはタイム ゾーン情報がありませんが、ありCalendarます。特にウェブサービスを扱ったり、世界中からデータを提供したり消費したりするときは、常にこれを念頭に置いておく必要があります...
  • 私の個人的なお気に入りは、少し異なりますが、地獄のように醜い場合があります。カレンダーでは、MONTH は 0 からインデックス付けされます。したがって、jarnbjo が述べたように、12 の月は 12 月ではありません...
  • 通常、書式設定オブジェクトはスレッド セーフではありません。それらを静的変数で使用するのは悪臭です! これは DecimalFormat にも当てはまります。
于 2013-09-11T17:11:46.267 に答える
2

まず、XMLGregorianCalendarインスタンスをオブジェクトに変換し、目的の言語のオブジェクトDateを作成する必要があります。Locale

Date date = xmlCalendar.toGregorianCalendar().getTime();        
Locale locale = new Locale("es");

その後、次のいずれかを使用SimpleDateFormatして、指定された言語で月の名前を取得できます。

SimpleDateFormat sdf = new SimpleDateFormat("MMMM", locale);        
System.out.println(sdf.format(date));

出力: septiembre

または、ローカライズされた日付フォーマッタを取得して、指定した言語を使用して日付全体を出力できます。

System.out.println(DateFormat.getDateInstance(DateFormat.LONG, locale).format(date));

出力予定: 2013 年 9 月 11 日

于 2013-09-11T17:24:53.993 に答える