web-dev-qa-db-ja.com

ロケールに応じた日付と時刻のフォーマット

JavaとAndroid開発の両方に慣れていないので、これは愚かな質問かもしれませんが、今は何日も探していて見つけることができません。解決策:

ユーザーのロケールに応じてJava.util.Dateを出力しようとします。

StackOverflowで検索すると、次のようになります。

Java.util.Date date = new Date();
String dateString = DateFormat.getDateFormat(getApplicationContext()).format(date);

これは出力します:

20/02/2011

私のフランス語ローカライズされた電話で。ほとんど問題ありません。

ユーザーのロケールを使用して、Dateの-​​時間、分、秒の部分も出力するにはどうすればよいですか? Androidのドキュメントを探していましたが、何も見つかりませんでした。

どうもありがとう。

33
ereOn

Android.text.format.DateFormat.getTimeFormat()を使用します

ref: http://developer.Android.com/reference/Android/text/format/DateFormat.html

33
Tiago

tl; dr

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.time

質問のコードは、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.time フレームワークはJava 8以降に組み込まれています。これらのクラスは、厄介な古い レガシーJava.util.Date.Calendar 、& Java.text.SimpleDateFormat

Joda-Time プロジェクト、現在 メンテナンスモード になっています)は、Java.timeへの移行を推奨しています。

詳細については、 Oracleチュートリアル を参照してください。また、スタックオーバーフローで多くの例と説明を検索してください。仕様は JSR 310 です。

Java.timeクラスはどこで入手できますか?

  • Java SE 8 および SE 9 以降
    • ビルトイン。
    • 標準の一部Java実装がバンドルされたAPI。
    • Java 9には、いくつかのマイナーな機能と修正が追加されています。
  • Java SE 6 および SE 7
  • Android
    • ThreeTenABP プロジェクトは適応しますThreeTen-Backport(前述) )Android具体的には、.
    • How to use… を参照してください。

ThreeTen-Extra プロジェクトは、追加のクラスでJava.timeを拡張します。このプロジェクトは、Java.timeへの将来の追加の可能性を証明する基盤です。 IntervalYearWeekYearQuarter 、および more

11
Basil Bourque

_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

7
Cristan

DateFormat.getTimeInstance()は、デフォルトロケールのデフォルトのフォーマットスタイルを持つ時刻フォーマッタを取得します。スタイルとLocaleを渡すこともできます。

3
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;
}
1
Ivan Kocic

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())

お役に立てば幸いです。

0