Преобразование строк даты Android в объекты даты

#android #date #time

#java #Android #Дата #время

Вопрос:

В Android дата каждого события (например, дня рождения и годовщины) сохраняется в строковом формате, например, «2011-12-24».

Это, по крайней мере, относится к моему телефону. Возможно, некоторые другие телефоны могут сохранять эти даты в других форматах, если у них календарь, отличный от григорианского.

Даже для телефонов с установленным григорианским календарем существуют строки даты с часами и минутами и без них. Я получаю такую строку даты, когда запрашиваю таблицу контактов для события:

 cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.ST‌​ART_DATE))
 

Это приводит к (например):

«2011-12-14» или «2011-12-24T00:00:00Z»

Вы можете видеть, что существует множество различных возможных форматов. Чтобы вычислять с помощью дат, мне нужно преобразовать их из строки в объекты даты, не так ли?

Как я могу это сделать?

PS: я знаю, что есть функция синтаксического анализа для объектов даты Java:

 DateFormat myDateFormat = new SimpleDateFormat("dd/MM/yy");
Date tempDate = myDateFormat.parse("24/12/2011");
 

Но в Android я не знаю, с каким форматом я столкнусь, не так ли?

Ответ №1:

Android работает с объектами даты. Всякий раз, когда вам нужно проанализировать дату из строки, это потому, что эта дата была сериализована, скорее всего, в файле. В этом случае вы бы знали, какой формат был использован. Объект Date используется в настройках, объект date используется почти везде, о чем я могу думать, что касается общих служб, действий и т. Д. Это означает, что почти никогда не требуется анализировать строку из даты, если, как я уже сказал, вы не работаете с сериализованным исходным кодом, читаете его из веб-службы и т. Д. Если вы можете рассказать нам о своем сценарии, вы можете получить более конкретный ответ.

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

 DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(getApplicationContext());
 

Комментарии:

1. Спасибо за приятный и полезный ответ! Я запрашиваю таблицу контактов для события: cursor.getString(cursor.getColumnIndex(ContactsContract. CommonDataKinds. Событие. START_DATE))

2. … и здесь я получаю дату в строковой форме, например «2011-12-24T00:00:00Z». Как я могу получить дату в качестве объекта даты? Нет метода «cursor.getDate ()» …

3. В этом случае вы можете проанализировать его. Кроме того, этот формат даты будет одинаковым независимо от набора языков, поэтому вы можете с уверенностью предположить, что.

4. Ах, так в этом случае нет способа получить объект даты? : D Должен быть один способ — разбор строки глуп и может привести к неправильным результатам, не так ли? Как я узнаю, с какими форматами я столкнусь? Какой часовой пояс?

5. Вы всегда будете получать один и тот же формат, независимо от выбранного пользователем языка. Итак, что бы вы ни получили в своих тестах, вы всегда будете получать. Безопасный способ работы с ним — не передавать формат функции анализа даты.

Ответ №2:

 import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

SimpleDateFormat myDateFormat = new SimpleDateFormat("dd/MM/yy");
        Date tempDate;
        try {
            tempDate = myDateFormat.parse("24/12/2011");
              long milliseconds=tempDate.getTime();
              Toast.makeText(getApplicationContext(), milliseconds "", 1).show();
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }