[英]How to calculate the difference between the dates shown in the piechart with the current date
我有一个 SQLite 数据库,其中包含许多任务和完成这些任务的日期。 然后我将这些日期添加为饼图中的 PieEntries。 我想找出图表上的日期和当前日期之间的差异。
这个想法是根据日期之间的差异为图表的不同部分设置不同的颜色。
我在这里找到了一些帖子,例如我一直在使用的帖子: 两个日期之间的 Android 差异。 但到目前为止,似乎没有任何效果。
下面是我的光标在数据库中循环并使用它来获取日期并将它们放入 PieEntry 列表中。 还有我用来计算当前日期的代码和用于计算填充图表和当前日期之间差异的代码。
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();
这个想法是从 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();
此新代码不会返回天数差异的整数值,并且所有图表段当前都显示为红色。
这是一个猜测:当你做mPieDataSet.setColor(Color.RED);
,我认为您是在整个饼图上设置颜色,而不仅仅是在单个切片/饼图条目上。 这样,如果您在循环中处理的最后一个条目是 90 天前的,那么您的所有饼图都会变为红色。
我无法在您的代码中重现错误的计算,其中天数会超过 90,而本不应该。 如果我将pastDateString
设置为4/1/2019
,我得到 88 天,并且您的if
/ else
构造选择黄色方式通过。
免责声明:我不知道 MPAndroidChart。
如果您的数据库具有date
数据类型,请将其用于日期。 不要将它们存储为字符串。 其次,考虑不使用SimpleDateFormat
、 Calendar
和Date
。 它们的设计很差,而且已经过时了。 您可以将 ThreeTenABP 添加到您的 Android 项目中,并使用LocalDate
和来自 java.time(现代 Java 日期和时间 API)的其他类。 和它一起工作要好得多。 并为计算日期之间的差异提供更好的支持:
long days = ChronoUnit.DAYS.between(pastLocalDate, LocalDate.now(yourTimeZone));
java.time
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.