1

このような SimpleDateFormat を取得しました。

SimpleDateFormat dateFormat=new SimpleDateFormat("dd MMMM", new Locale("tr"));
txtDateText.setText(dateFormat.format(selectedDate).toUpperCase(new Locale("tr")));

Android 3.03.13.24.0およびその他の最新バージョンで試してみると、この結果が得られます。

02 KASIM

しかし、その他を試着するとAndroid 2.22.3この結果が得られます。

02 11

どうすれば解決できますか?

4

3 に答える 3

4

私はかつて同じ問題を抱えていました。トルコ語のロケールが存在するかどうかを確認できます。

ところで、から月名を取得することをお勧めしstrings.xmlます。将来、アプリケーションに多言語サポートを追加することがより簡単になります。日付オブジェクトからデフォルトのロケールで月番号を取得し、月配列からその参照を取得するだけです。

編集:この API レベルの違いの理由を知り、API レベル 10 と 14 のソース コードをダウンロードして、デバッグを開始しました。

理由:すぐに、違いはjava.text.DateFormatSymbolsクラスから生じます。両方の API に同じコードがありますが、異なるバージョンの (または動作が異なる) を使用していますlibcore.icu.LocaleData。インスタンスの初期化を担当しますDateFormatSymbols

詳細:SimpleDateFormatインスタンスがロケールで作成された 場合、このパラメーターはformatData、(のインスタンスであるDateFormatSymbols) と呼ばれるそのプロパティをインスタンス化するために使用されます。

そのコンストラクタ:

API レベル 10 および 14 以降java.text.DateFormatSymbols

public DateFormatSymbols(Locale locale) {
    this.locale = locale;
    this.localPatternChars = SimpleDateFormat.PATTERN_CHARS;
    LocaleData localeData = LocaleData.get(locale);
    this.ampms = localeData.amPm;
    this.eras = localeData.eras;
    this.months = localeData.longMonthNames;
    this.shortMonths = localeData.shortMonthNames;
    this.weekdays = localeData.longWeekdayNames;
    this.shortWeekdays = localeData.shortWeekdayNames;

    // ICU/Android extensions.
    this.longStandAloneMonths = localeData.longStandAloneMonthNames;
    this.shortStandAloneMonths = localeData.shortStandAloneMonthNames;
    this.longStandAloneWeekdays = localeData.longStandAloneWeekdayNames;
    this.shortStandAloneWeekdays = localeData.shortStandAloneWeekdayNames;
}

デバッグできませんでしたlibcore.icu.LocaleDataが、そのクラスに違いがあります。LocalDataAPI レベル 10 と 14 では、インスタンスとは異なる方法で値が読み込まれます。変更ログを調査して、LocaleData の違いを見つけることができます。

合計: Api レベル 10 より前の未定義のロケール ("xx" など) で aSimpleDateFormatが作成された場合、システムはデフォルト ロケールの出力の数値表現 (月名 [1..12]、日名 [1..6]) を使用します。 . API レベル 14 以降では、ロケールが見つからない場合、デフォルトのロケールに基づいて出力が表示されます。(API レベル 11、12、13 ではまだテストしていません。)

システムのデフォルトのロケールを使用することをお勧めします。ロケールを使用する必要がある場合は、まずそれが定義されているかどうかを確認してください。定義されていない場合は、独自のロジックを作成してください。

日付を表示したい場合は、この回答の2行を検討してください。

于 2013-10-31T15:34:51.010 に答える
1

「tr」ロケールがこれらのデバイスで使用できない可能性がありますか?

次の方法で確認できると思います。

for (Locale locale : Locale.getAvailableLocales()) {
    System.out.println(locale.toString());
}
于 2013-10-31T15:22:53.443 に答える
0

古いデバイスにはトルコ語ロケールがインストールされていないようです。

于 2013-10-31T15:23:02.813 に答える