JavaとAndroid開発の両方に慣れていないので、これは愚かな質問かもしれませんが、今は何日も探していて見つけることができません。解決策:
ユーザーのロケールに応じてJava.util.Date
を出力しようとします。
StackOverflowで検索すると、次のようになります。
Java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);
これは出力します:
20/02/2011
私のフランス語ローカライズされた電話で。ほとんど問題ありません。
ユーザーのロケールを使用して、Date
の-時間、分、秒の部分も出力するにはどうすればよいですか? Androidのドキュメントを探していましたが、何も見つかりませんでした。
どうもありがとう。
Android.text.format.DateFormat.getTimeFormat()
を使用します
ref: http://developer.Android.com/reference/Android/text/format/DateFormat.html
ZonedDateTime // Represent a moment as seen in the wall-clock time used by the people of a particular region (a time zone).
.now( ZoneId.of( "Asia/Kolkata" ) ) // Capture the current moment as seen in the specified time zone. Returns a `ZonedDateTime` object.
.format( // Generate text representing the value of this `ZonedDateTime` object.
DateTimeFormatter // Class controlling the generation of text representing the value of a date-time object.
.ofLocalizedDateTime ( FormatStyle.FULL ) // Automatically localize the string representing this date-time value.
.withLocale ( Locale.FRENCH ) // Specify the human language and cultural norms used in localizing.
) // Return a `String` object.
質問のコードは、Java 8以降に組み込まれているJava.timeクラスに取って代わられた、今ではレガシーである厄介な古い日時クラスを使用しています。
ロケールとタイムゾーンは互いに関係ありません。ロケールは、日時値を表す文字列を生成するときに使用される人間の言語と文化的規範を決定します。タイムゾーンは、タイムライン上の瞬間を表すために使用される特定の地域の 実時間 を決定します。
Instant
クラスは [〜#〜] utc [〜#〜] のタイムライン上の瞬間を表し、 ナノ秒 (最大9(9)の解像度)小数の桁)。
Instant instant = Instant.now();
2016-10-12T07:21:00.264Z
タイムゾーンを適用してZonedDateTime
を取得します。インドのタイムゾーンを使用してこの瞬間を表示することを任意に選択します。同じ瞬間、タイムライン上の同じポイント。
ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = instant.atZone( z );
2016-10-12T12:51:00.264 + 05:30 [アジア/コルカタ]
ケベック州カナダのロケールを使用して文字列を生成します。 Java.timeに文字列を自動的にローカライズさせます。
Locale l = Locale.CANADA_FRENCH;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( l );
String output = zdt.format ( f ); // Indian time zone with Québécois presentation/translation.
メルクレディ2016年10月12日12時間51時
Java.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い レガシーJava.util.Date
、 .Calendar
、& Java.text.SimpleDateFormat
。
Joda-Time プロジェクト、現在 メンテナンスモード になっています)は、Java.timeへの移行を推奨しています。
詳細については、 Oracleチュートリアル を参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。
Java.timeクラスはどこで入手できますか?
ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeへの将来の追加の可能性を証明する基盤です。 Interval
、 YearWeek
、 YearQuarter
、および more 。
_Java.text.DateFormat
_には、必要になる可能性のあるすべての関数があります。
DateFormat.getDateInstance()
DateFormat.getTimeInstance()
しかし、必要なのは次のとおりです。
DateFormat.getDateTimeInstance()
日付/時刻部分とロケールの長さも指定できます。最終結果は次のようになります。
DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.SHORT, Locale.FRENCH).format(Date);
ソース: http://docs.Oracle.com/javase/7/docs/api/Java/text/DateFormat.html
DateFormat.getTimeInstance()
は、デフォルトロケールのデフォルトのフォーマットスタイルを持つ時刻フォーマッタを取得します。スタイルとLocale
を渡すこともできます。
public static String formatDate(Date date, boolean withTime)
{
String result = "";
DateFormat dateFormat;
if (date != null)
{
try
{
String format = Settings.System.getString(context.getContentResolver(), Settings.System.DATE_FORMAT);
if (TextUtils.isEmpty(format))
{
dateFormat = Android.text.format.DateFormat.getDateFormat(context);
}
else
{
dateFormat = new SimpleDateFormat(format);
}
result = dateFormat.format(date);
if (withTime)
{
dateFormat = Android.text.format.DateFormat.getTimeFormat(context);
result += " " + dateFormat.format(date);
}
}
catch (Exception e)
{
}
}
return result;
}
getBestDateTimePattern()
を使用します_Android.text.format
_パッケージのDateFormat.getBestDateTimePattern()
は、ユーザーが設定したロケールに従って、可能な限り最適な日付と時刻を作成します。
例:スケルトン_EEEE, MMM d, YYYY, jj:mm
_は、ローカライズされた日付と時刻を次のように返します。
_Locale English (India): Monday 9 Sep 2019, 9:33 PM
Locale English (United States): Monday, Sep 9, 2019, 9:33 PM
Locale español (Estados Unidos): lunes, 9 de sep. de 2019 9:33 PM
Locale español (México): lunes, 9 de sep de 2019 21:33
Locale français (France): lundi 9 sept. 2019 à 21:33
Locale português (Brasil): segunda-feira, 9 de set de 2019 21:33
_
異なるロケールの場合も同様です。また、ロケールの12時間制または24時間制も順守します。
独自のスケルトンのカスタマイズについては、unicode.orgの TS#35 パターンを参照してください。
Kotlinでテストされたサンプルコードを次に示します。
_val skeleton = DateFormat.getBestDateTimePattern(Locale.getDefault(), "EEEE, MMM d, YYYY, jj:mm")
val formatter = SimpleDateFormat(skeleton, Locale.getDefault()).apply {
timeZone = TimeZone.getDefault()
applyLocalizedPattern(skeleton)
}
val dateTimeText = formatter.format(calendar.time)
Log.d("YourClass", "Locale ${Locale.getDefault().displayName}: $dateTimeText")
_
Calendar
クラスの代わりに、ZonedDateTime
を使用することもできます。それをDate
オブジェクトに変換し、format()
に渡します。例:Date(zonedDateTime.toInstant().toEpochMilli())
お役に立てば幸いです。