web-dev-qa-db-ja.com

Android)にローカライズされた形式で日付を表示する

現在、Android用の最初のアプリを作成しています。私が問題を抱えているのは、SimpleCursorAdapterに関連する日付の保存とローカライズされた表示です。 SQLitedatabaseへのアクセスを3つのテーブルでカプセル化するクラスがあります。このクラスは、すべての日付をISO形式( "yyyy-MM-dd")で保存します。日付値がデータベースから読み取られて画面に表示されるときに、ローカライズされた形式でフォーマットする必要があります。これが私が思いついたアプローチです。 ViewBinderを使用してフォーマットを行います。

_adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
    @Override
    public boolean setViewValue(View view, Cursor cursor,
            int columnIndex) {
        if (view.getId() == R.id.text1) {
            ((TextView) view).setText(getDateFormatView().format(
                parseDatabaseDate(cursor.getString(columnIndex))));
            return true;
        } else if (view.getId() == R.id.text2) {
            ((TextView)view).setText(
                cursor.getString(columnIndex));
          return true;
        } else {
            return false;
        }
    }
});
_

getDateFormatView()は、_strings.xml_から読み取られるパターンでSimpleDateFormatオブジェクトを作成します。 parseDatabaseDate()は、定数パターン_yyyy-MM-dd_を使用して構築されたSimpleDateFormatを使用して、データベースからの日付の解析を行います。

このコードは問題なく機能しますが、それを行うためのより良い方法があるかどうか疑問に思っています。私が好きではないのは、私が必要としていることです:

  • 2つのSimpleDateFormatオブジェクト(1つはSQLiteDatabaseから日付文字列を解析するためにparseDatabaseDate()で使用され、もう1つは値をフォーマットするために使用されます)
  • 作成されてすぐに破棄される_Java.util.Date_オブジェクト
  • かなり多くの(私の意見では)定型コード。

だから私は尋ねているのです:ローカライズされた形式で日付を表示するより良い方法はありますか?

22

解析をスキップしたい場合は、代わりに日付をlongとして保存できます。次に、解析なしのlongを使用して新しいDateオブジェクトを作成できます。

これはあなたの質問に直接関係していませんが、使用を検討したいと思うかもしれないことの1つは、日付フォーマッターを取得するための Android.text.format.DateFormat です。このようにして、独自のプリセットではなく、ユーザーのロケール設定に日付/時刻をフォーマットします。また、独自のSimpleDateFormatを作成する必要がなくなるため、コードが単純になる可能性もあります。

これらの2つのことを念頭に置いて、独自のメソッドへの呼び出しを取り除くことができます。

((TextView) view).setText(Android.text.format.DateFormat.getDateFormat().format(new Date(cursor.getString(columnIndex))));
43
Dan Lew