web-dev-qa-db-ja.com

androidのユーザーロケールに基づいた日付フォーマット

ユーザーロケールに基づいて生年月日を表示したい。私のアプリケーションでは、私のフィールドの1つが生年月日であり、現在のフォーマットはdd/mm/yyyy。そのため、ユーザーがロケールを変更した場合、それに応じて日付形式も変更する必要があります。ポインターやコードサンプルは、問題を克服するのに本当に役立ちます。

47
shailbenq

ユーザーロケールに従って日付をフォーマットする DateFormat クラスを使用できます。

例:

String dateOfBirth = "26/02/1974";
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
Date date = null;
try {
    date = sdf.parse(dateOfBirth);
} catch (ParseException e) {
    // handle exception here !
}
Java.text.DateFormat dateFormat = Android.text.format.DateFormat.getDateFormat(context);
String s = dateFormat.format(date);

必要な冗長性のレベルに応じて、さまざまなメソッドgetLongDateFormatgetMediumDateFormatを使用できます。

79
Arnaud

ロケールに従って日付形式を変更するには、次のコードが役立ちました。

    String dateOfBirth = "26/02/1974";
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    Date date = null;
    try {
        date = sdf.parse(dateOfBirth);
    } catch (ParseException e) {
        // handle exception here !
    }

    String myString = DateFormat.getDateInstance(DateFormat.SHORT).format(date);

その後、ロケールを変更すると、それに基づいて日付形式が変更されます。日付パターンの詳細: http://docs.Oracle.com/javase/tutorial/i18n/format/dateFormat.html

12

Android APIは、ローカライズされた日付形式を簡単に表示する方法を提供します。次のコードが機能します。

public class FileDateUtil {
    public static String getModifiedDate(long modified) {
        return getModifiedDate(Locale.getDefault(), modified);
    }

    public static String getModifiedDate(Locale locale, long modified) {
        SimpleDateFormat dateFormat = null;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
            dateFormat = new SimpleDateFormat(getDateFormat(locale));
        } else {
            dateFormat = new SimpleDateFormat("MMM/dd/yyyy hh:mm:ss aa");
        }

        return dateFormat.format(new Date(modified));
    }

    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
    public static String getDateFormat(Locale locale) {
        return DateFormat.getBestDateTimePattern(locale, "MM/dd/yyyy hh:mm:ss aa");
    }
}

次のコードを確認できます。

String koreaData = FileDateUtil.getModifiedDate(Locale.KOREA, System.currentTimeMillis());
String franceData = FileDateUtil.getModifiedDate(Locale.FRENCH, System.currentTimeMillis());
String defaultData = FileDateUtil.getModifiedDate(Locale.getDefault(), System.currentTimeMillis());

String result = "Korea : " + koreaData + System.getProperty("line.separator");
result += "France : " + franceData + System.getProperty("line.separator");
result += "Default : " + defaultData + System.getProperty("line.separator"); 
tv.setText(result);
10
Justin Song

単純な

日付と時刻の場合:

DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());

ちょうど日付の場合:

DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
8
David_E

受け入れられた答えは質問が出されたときは正しいものでしたが、後で時代遅れになりました。私は現代の答えに貢献しています。

Java.timeおよびThreeTenABP

    DateTimeFormatter dateFormatter = DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT);

    LocalDate dateOfBirth = LocalDate.of(1991, Month.OCTOBER, 13);
    String formattedDob = dateOfBirth.format(dateFormatter);
    System.out.println("Born: " + formattedDob);

JVMのロケール設定(通常はデバイスから取得)に応じて異なる出力を提供します。例えば:

  • カナダのフランス語:Born: 91-10-13
  • 中国語:Born: 1991/10/13
  • ドイツ語:Born: 13.10.91
  • イタリア語:Born: 13/10/91

より長い形式が必要な場合は、別の形式スタイルを指定できます。米国英語ロケールでの出力例:

  • FormatStyle.SHORTBorn: 10/13/91
  • FormatStyle.MEDIUMBorn: Oct 13, 1991
  • FormatStyle.LONGBorn: October 13, 1991
  • FormatStyle.FULLBorn: Thursday, October 13, 1991

質問:AndroidでJava.timeを使用できますか?

はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。

  • Java 8以降および新しいAndroidデバイス(APIレベル26以降)では、最新のAPIが組み込まれています。
  • Java 6および7は、モダンクラスのバックポートであるThreeTenバックポートを取得します(JSR 310のスリーテン。下部のリンクを参照)。
  • オン(古い)Android ThreeTenバックポートのAndroidエディションを使用します。ThreeTenABPと呼ばれます。そして、サブパッケージでorg.threeten.bpから日時クラスをインポートしてください。

質問:ユーザーのローカル形式でユーザー入力を受け入れることはできますか?

はい、できます。フォーマッタは、ユーザーからの文字列をLocalDateに解析するためにも使用できます。

    LocalDate date = LocalDate.parse(userInputString, dateFormatter);

最初にサンプルの日付をフォーマットし、ユーザーに表示することをお勧めします。そうすれば、ユーザーのプログラムが自分のロケールにどのフォーマットを期待しているかを見ることができます。例として、日付が12より大きく、年が31より大きい日付を使用して、例から日、月、年の順序を確認できるようにします(より長い形式の場合、年は4桁であるため重要ではありません) )。

ユーザーが誤った形式または無効な日付で日付を入力した場合、解析はDateTimeParseExceptionをスローします。キャッチして、ユーザーが再試行できるようにします。

質問:時刻で同様にできますか?日付と時刻?

はい。ユーザーのロケールに従って時刻をフォーマットするには、DateTimeFormatter.ofLocalizedTimeからフォーマッターを取得します。日付と時刻の両方に対して、DateTimeFormatter.ofLocalizedDateTimeのオーバーロードバージョンの1つを使用します。

DateFormat、SImpleDateFormat、Dateクラスを避ける

DateFormatSimpleDateFormat、およびDateを使用しないことをお勧めします。これらのクラスは設計が不十分で、古く、特に最初の2つは面倒なことで有名です。代わりに、LocalDateDateTimeFormatter、およびJava.timeのその他のクラス、モダンなJava date and time API)を使用します。

リンク集

2
Ole V.V.

日付形式パターンを取得するには、次を実行します。

Format dateFormat = Android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();

その後、パターンに従って入力をフォーマットできます。

0
manish poddar