Как рассчитать разницу между датами, показанными в круговой диаграмме с текущей датой - PullRequest
1 голос
/ 31 марта 2019

У меня есть база данных SQLite, содержащая ряд задач и даты, когда эти задачи были выполнены.Затем я добавляю эти даты как PieEntries в круговую диаграмму.Я хотел бы найти разницу между датами на графике и текущей датой.

Идея состоит в том, чтобы установить разные цвета для разных сегментов диаграммы в зависимости от разницы между датами.

Я нашел здесь несколько постов, таких как этот, который я использовал: Разница между двумя датами в Android .Но пока, похоже, ничего не работает.

Ниже мой курсор перебирает базу данных и использует ее, чтобы получить даты и поместить их в PieEntry List.Есть также код, который я использую для вычисления текущей даты, и код для вычисления разницы между теми, которые заполняют график, и текущей датой.

final ArrayList<TaskObject> taskObjects = new ArrayList<>();

    if (mCursor != null) {
        mCursor.moveToFirst();
        do {
            TaskObject taskObject = new TaskObject();
            taskObject.setTask(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_TASK)));
            taskObject.setObserver(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_OBSERVER)));
            taskObject.setDate(mCursor.getString(mCursor.getColumnIndex(TaskEntry.COLUMN_DATE)));
            taskObjects.add(taskObject);
        } while (mCursor.moveToNext());

        float distribution = 100 / taskObjects.size();

        List<PieEntry> pieEntries = new ArrayList<>();
        for (int i = 0; i < taskObjects.size(); i++) {
            pieEntries.add(new PieEntry(distribution, (taskObjects.get(i).getTask()) + "\n" + taskObjects.get(i).getDate()));

            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
            String pastDateString = taskObjects.get(i).getDate();
            Date currentDate = Calendar.getInstance().getTime();
            Date pastDate = null;
            try {
                pastDate = simpleDateFormat.parse(pastDateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            //Comparing dates
            long difference = Math.abs(currentDate.getTime() - pastDate.getTime());
            long differenceDates = difference / (24 * 60 * 60 * 1000);

            //Convert long to String
            String dayDifference = Long.toString(differenceDates);

            Log.e("HERE","HERE: " + dayDifference);
        }

        PieDataSet pieDataSet = new PieDataSet(pieEntries, "Label");
        pieDataSet.setColors(ColorTemplate.MATERIAL_COLORS);
        PieData pieData = new PieData(pieDataSet);

        mPieChart.setData(pieData);
        mPieChart.invalidate();
    }
    mCursor.close();

Идея состоит в том, чтобы вычесть pastDate изcurrentDate для отображения целочисленного значения, которое затем можно использовать для изменения цвета сегмента круговой диаграммы.

РЕДАКТИРОВАТЬ:

            List<PieEntry> pieEntries = new ArrayList<>();
            for (int i = 0; i < taskObjects.size(); i++) {
                pieEntries.add(new PieEntry(distribution, (taskObjects.get(i).getTask()) + "\n" + taskObjects.get(i).getDate()));

                mPieDataSet = new PieDataSet(pieEntries, "Versatility Matrix & Qualification Status");

                String pastDateString = taskObjects.get(i).getDate();
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy");
                Date d = null;
                try {
                    d = simpleDateFormat.parse(pastDateString);//catch exception
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

                Calendar pastDate = Calendar.getInstance();
                pastDate.setTime(d);

                Calendar currentDate = Calendar.getInstance();

                long diff = currentDate.getTimeInMillis() - pastDate.getTimeInMillis();
                long days = diff/(24*60*60*1000);
                int daysDifference = (int) days;
                Log.d(TAG, "days in difference = " + daysDifference);


                if(daysDifference >= 90) {
                    mPieDataSet.setColor(Color.RED);
                } else if (daysDifference < 90 && daysDifference >= 60) {
                    mPieDataSet.setColor(Color.YELLOW);
                } else {
                    mPieDataSet.setColor(Color.GREEN);
                }
            }

            PieData pieData = new PieData(mPieDataSet);
            mPieChart.setData(pieData);
            mPieChart.invalidate();

Этот новый код не возвращает целочисленное значение для разницыв днях и все сегменты графика в настоящий момент отображаются красным цветом.

1 Ответ

1 голос
/ 02 апреля 2019

Это предположение: когда вы делаете mPieDataSet.setColor(Color.RED);, я думаю, что вы устанавливаете цвет для всего пирога, а не только для отдельной записи среза / пирога. Таким образом, если запись последняя , которую вы обрабатываете в цикле, имеет возраст 90 дней, все ваши круговые диаграммы получают красный цвет.

Мне не удалось воспроизвести неверный расчет в вашем коде, где количество дней превысило бы 90, а это не так. Если я установлю pastDateString на 4/1/2019, я получу 88 дней, и ваша конструкция if / else выберет ЖЕЛТЫЙ путь до конца.

Отказ от ответственности: я не знаю MPAndroidChart.

Общие рекомендации

Если ваша база данных имеет тип данных date, используйте его для дат. Не храните их как строки. Во-вторых, не используйте SimpleDateFormat, Calendar и Date. Они плохо спроектированы и давно устарели. Вы можете добавить ThreeTenABP в свой проект Android и использовать LocalDate и другие классы из java.time, современного API даты и времени Java. Намного приятнее работать. И дает гораздо лучшую поддержку для расчета разниц между датами:

    long days = ChronoUnit.DAYS.between(pastLocalDate, LocalDate.now(yourTimeZone));

Ссылки

...