Отображение дат в локализованном формате на Android - PullRequest
22 голосов
/ 22 января 2010

Я сейчас создаю свое первое приложение для Android. У меня проблемы с хранением и локализованным отображением дат в связи с SimpleCursorAdapter. У меня есть класс, который инкапсулирует доступ к SQLitedatabase с тремя таблицами. Этот класс заботится о сохранении всех дат в формате ISO ("гггг-ММ-дд"). Когда значения даты считываются из базы данных и отображаются на экране, я хочу, чтобы они были отформатированы в локализованном формате. Вот подход, который я придумала. Для форматирования используется 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() создает объект SimpleDateFormat с шаблоном, считываемым из strings.xml. parseDatabaseDate() выполняет синтаксический анализ даты из базы данных с SimpleDateFormat, построенным с использованием константного шаблона yyyy-MM-dd.

Хотя этот код работает просто отлично, мне интересно, есть ли лучший способ сделать это. Что мне не нравится, так это то, что мне нужно:

  • два SimpleDateFormat объекта (один используется в parseDatabaseDate() для анализа строки даты из SQLiteDatabase, другой используется для форматирования значения)
  • a java.util.Date объект, который создается, а затем сразу выбрасывается
  • довольно много (на мой взгляд) шаблонного кода.

Так вот почему я спрашиваю: есть ли лучший способ отображать даты в локализованном формате?

1 Ответ

43 голосов
/ 22 января 2010

Если вы хотите пропустить синтаксический анализ, вы можете вместо этого сохранить дату как длинную. Тогда вы можете просто создать новый объект Date, используя long с нулевым разбором.

Это не имеет прямого отношения к вашему вопросу, но: одна вещь, которую вы могли бы рассмотреть, - android.text.format.DateFormat для получения форматеров даты. Таким образом вы форматируете свои даты / время в соответствии с настройками локали пользователя, а не с вашими пресетами. Это также может упростить ваш код, поскольку вам больше не нужно создавать собственный SimpleDateFormat.

Имея в виду две эти вещи, вы можете избавиться от вызовов ваших собственных методов:

((TextView) view).setText(android.text.format.DateFormat.getDateFormat().format(new Date(cursor.getString(columnIndex))));
...