ユーザーロケールに基づいて生年月日を表示したい。私のアプリケーションでは、私のフィールドの1つが生年月日であり、現在のフォーマットはdd/mm/yyyy
。そのため、ユーザーがロケールを変更した場合、それに応じて日付形式も変更する必要があります。ポインターやコードサンプルは、問題を克服するのに本当に役立ちます。
ユーザーロケールに従って日付をフォーマットする 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);
必要な冗長性のレベルに応じて、さまざまなメソッドgetLongDateFormat
、getMediumDateFormat
を使用できます。
ロケールに従って日付形式を変更するには、次のコードが役立ちました。
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
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);
単純な
日付と時刻の場合:
DateFormat format = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.SHORT, Locale.getDefault());
ちょうど日付の場合:
DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.getDefault());
受け入れられた答えは質問が出されたときは正しいものでしたが、後で時代遅れになりました。私は現代の答えに貢献しています。
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.SHORT
:Born: 10/13/91
FormatStyle.MEDIUM
:Born: Oct 13, 1991
FormatStyle.LONG
:Born: October 13, 1991
FormatStyle.FULL
:Born: Thursday, October 13, 1991
はい、Java.timeは古いものと新しいものでうまく動作しますAndroidデバイス。少なくともJava 6が必要です。
org.threeten.bp
から日時クラスをインポートしてください。はい、できます。フォーマッタは、ユーザーからの文字列をLocalDate
に解析するためにも使用できます。
LocalDate date = LocalDate.parse(userInputString, dateFormatter);
最初にサンプルの日付をフォーマットし、ユーザーに表示することをお勧めします。そうすれば、ユーザーのプログラムが自分のロケールにどのフォーマットを期待しているかを見ることができます。例として、日付が12より大きく、年が31より大きい日付を使用して、例から日、月、年の順序を確認できるようにします(より長い形式の場合、年は4桁であるため重要ではありません) )。
ユーザーが誤った形式または無効な日付で日付を入力した場合、解析はDateTimeParseException
をスローします。キャッチして、ユーザーが再試行できるようにします。
はい。ユーザーのロケールに従って時刻をフォーマットするには、DateTimeFormatter.ofLocalizedTime
からフォーマッターを取得します。日付と時刻の両方に対して、DateTimeFormatter.ofLocalizedDateTime
のオーバーロードバージョンの1つを使用します。
DateFormat
、SimpleDateFormat
、およびDate
を使用しないことをお勧めします。これらのクラスは設計が不十分で、古く、特に最初の2つは面倒なことで有名です。代わりに、LocalDate
、DateTimeFormatter
、およびJava.timeのその他のクラス、モダンなJava date and time API)を使用します。
Java.time
が最初に記述された場所。Java.time
のバックポートJava 6および7(JSR-310用のThreeTen))。日付形式パターンを取得するには、次を実行します。
Format dateFormat = Android.text.format.DateFormat.getDateFormat(getApplicationContext());
String pattern = ((SimpleDateFormat) dateFormat).toLocalizedPattern();
その後、パターンに従って入力をフォーマットできます。