Значения даты и времени в Java для Android от строковых до длинных до строковых - PullRequest
3 голосов
/ 01 октября 2010

Долгое время читатель, первый постер.

В Android захват даты с даты и выбора в виде строки в sqlite. Сортировка по дате не работает, потому что они строки (если я не делаю это неправильно.

Я погуглил эту проблему в течение ~ 5 дней, и похоже, что должен быть способ получить дату из средства выбора даты, преобразовать ее в длинную, сохранить в sqlite как длинную, выбрать и отсортировать значение длинной даты, затем преобразуйте длинную строку обратно в строку «мм / дд / гггг» для отображения. Я пробовал разные комбинации операторов разбора, Date, FormatDate и т. Д., Но безуспешно.

Мой фактический поток приложения будет: В начале действия получите текущую дату и отобразите ее в кнопке, которая вызывает средство выбора даты. Захватить новую дату из DatePicker (если он введен), сохраните его как длинный в sqlite. При открытии действия, отображающего список записей, выберите из sqlite с упорядочением по дате (Long), конвертируйте Long в строку «мм / дд / гггг» для отображения в ListView.

Если бы кто-то мог указать мне на пример кода, он был бы очень признателен - спасибо!

Evan

Ответы [ 3 ]

2 голосов
/ 02 октября 2010

Спустя несколько часов потянув за волосы, решение представляет собой смесь ответов и некоторых других вещей:

// variables declared
private int mYear;
private int mMonth;
private int mDay;

// datepicker declared and listened for
private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        mYear = year;
        mMonth = monthOfYear;
        mDay = dayOfMonth;
        updateDisplay();
    }
};

// converting the datestring from the picker to a long:
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_MONTH, mDay);
c.set(Calendar.MONTH, mMonth);
c.set(Calendar.YEAR, mYear);
Long lDate = c.getTime().getTime();

//The formatting that worked on the trip back from long to string 
// (I spent hours with SimpleDateFormat strings, years that were off by 1500, etc.):
String DateFormatted = DateFormat.getDateFormat(getApplicationContext()).format(helper.getDate(c)); // helper.getDate(c) is just the passing back of the Long date from my SELECT statement

Новое на форуме - Я пыталсяпроголосуйте как полезный, но у меня пока недостаточно очков репутации.

1 голос
/ 02 октября 2010

Я бы просто использовал дату, так как считаю, что объекты Calendar немного тяжелы для этой задачи. Получите ваши значения из вашего DatePicker:

public void onDateSet(DatePicker view, int year, 
                                  int monthOfYear, int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear;
                mDay = dayOfMonth;
                updateDisplay();
            }

Используйте целые числа, предоставленные DatePicker для создания даты:

Date date = new Date(mYear, mMonth, mDay);

Затем сохраните и сортируйте по длинному значению: date.getTime ().

В качестве альтернативы, если вам действительно нужно использовать строки для сортировки дат, отформатируйте их в формате гггг / мм / дд, чтобы обеспечить правильную сортировку, даже если вам нужно следить Я только что провел несколько тестов с SimpleDateFormat, и он анализирует неподходящие строки даты, например. 2010/09/31 интерпретируется как 2010/10/01. При проверке подобных вещей я всегда рекомендую запускать некоторые тесты JUnit.

1 голос
/ 01 октября 2010

Все объекты Date в java - это просто длинные значения за сценой. Вы можете получить значение Long из объекта Date Java, используя getTime (), сохраняя полученное значение long, а затем инициализируя новый объект Date, используя это значение long в конструкторе. Поскольку DatePicker предоставляет интерфейсы для дня, месяца и года, вы должны использовать класс календаря java в качестве промежуточного, создав новый объект Calendar, установив день, месяц и год перед извлечением объекта Date, а затем длинное значение из объекта Date.

Я бы сказал что-то вроде этого:

DatePicker dp = blah blah;
Calendar c = Calendar.getInstance();

c.set(Calendar.DAY_OF_MONTH, dp.getDayOfMonth());
c.set(Calendar.MONTH, dp.getMonth());;
c.set(Calendar.YEAR, dp.getYear());

long l = c.getTime().getTime();

Отсюда вы можете сериализовать ваше длинное значение. Очевидно, что для обратного процесса, который вы вытаскиваете из длинного значения, создайте объект Date с длинным значением, а затем используйте вызов Calendar.setTime (Date) перед использованием функции Calendar.get, чтобы получить значения для использования в DatePicker.init или используя объект SimpleDateFormat, чтобы подготовить его для отображения в формате, как вы описали.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...