7

Java Dateから月と年の情報だけを抽出してGUIに表示する必要があります。 この日付は、ユーザーロケールを使用して翻訳する必要があります。私は2つのローカライズされた日付をフォーマットするための方法を知っている :ロケールSIMPLIFIED_CHINESEと日付2013-02-18についてはnew SimpleDateFormat("yyyy M", locale).format(date) Javaでロケール固有の書式設定の日付フィールドを抽出する方法は?

使用DateFormat.getInstance(DateFormat.LONG, locale).format(date)

  • を使用して

    1. を、これは与える:

      1. 2013年2月18日

      LONGフォーマットを日(2013年2月)なしで使用する必要があります。 [変種2は、年月の順序がロケールの影響を受けないため、明らかに許容できません。 問題は次のようなものです。長い部分(18日)を日中の部分から削除する方法はありますか? 私はformat(Date date, StringBuffer toAppendTo, FieldPosition pos)というメソッドを使ってみましたが、これは余分な文字ではなく数字の部分だけを抽出することができます。

      DateFormat.getInstance(DateFormat.LONG, Locale.SIMPLIFIED_CHINESE)のパターンは、yyyy'年'M'月'd'日'です。日の部分を抽出するとyyyy'年'M'月'が得られます。 余分な文字()は、対応するフィールドにはマッピングされていないようですが、フォーマッタのための他の意味がない文字なので、これを達成するためにJavaのDateFormat標準を使用することはできません。

      私はDateFormatSymbolsLocaleServiceProviderを見ましたが、役に立たないと思います。 私にとっては、拡張のポイントはgetInstance(int style)メソッドに別の日付スタイルを追加することです。しかし、それはすべてのロケールのためにそれを実装せずに可能ではないようです...

      この分析は正しいですか?どのようにこのフォーマットをクリーンな方法で達成するには?

  • +0

    +1:これを行う方法もわかりません。たぶんJodaTimeライブラリを代わりに試してみてください。 –

    +0

    私は成功しなかった次のことを試しました: 'YearMonth.fromCalendarFields(cal).toString(DateTimeFormat.longDate()。withLocale(locale))'。 – Jidehem

    答えて

    1

    zh-CNロケールの年月のフォーマットには、あらかじめ定義された定数が存在しないと思われるので、フォーマットする必要があります。 SimpleDateFormatとして

    new SimpleDateFormat("yyyy年M月").format(date) 
    

    (私が強調されている)と言う:

    日付と時刻の形式は、日付と時刻のパターン文字列によって指定されています。日付と時刻のパターン文字列では、 'A'から 'Z'まで、 'a'から 'z'までの引用符で囲まれていない文字は、日付または時刻文字列の構成要素を表すパターン文字として解釈されます。解釈を避けるために、テキストは一重引用符( ')で引用できます。 ""は一重引用符を表します。 他のすべての文字は解釈されません;それらはフォーマット中に出力文字列に単純にコピーされるか、または解析中に入力文字列と照合されます。

    このようにして、中国語文字を書式文字列に配置することは安全です。

    JavaはUnicodeなので、Unicodeソース文字セットでコンパイルしている限り、ソース内の文字をインライン化できます。それ以外の場合は、このStringを外部的に読み取る必要があります。いくつかのUnicodeプロパティファイルまたはデータベースから取得します。

    +0

    要するに、Javaはそのような形式を国際化する方法を提供していません。手動で実装する必要があります。 – Jidehem

    +0

    はい、それは特別な日付形式です。月と年だけを表すDateTimeのようなデータ型があった場合、それをサポートする大きなチャンスがあったでしょう。あまり一般的ではないので、これを使用する必要があります。 IMHO DateTimeのようなデータ型は、とにかく複雑なトピックなので、もっと複雑にする価値はありません。 – gaborsch

    +0

    エンコードの問題を回避する別の方法は、パターンLONGの変換された値を取得し、パターンを保持する日付パターンのどの部分をハードコードするかです(この場合、パターンの最後の4文字を破棄します)。それは与える: >最終的なString patternFull =((SimpleDateFormat)DateFormat.getDateInstance(DateFormat.LONG、Locale.SIMPLIFIED_CHINESE))toPattern();最終的なストリングpatternYearMonth = patternFull.substring(0、patternFull.length() - 4); – Jidehem

    関連する問題