我正在尝试实现一些可以倒计时事件发生前还剩多少天的东西。虽然处理同一年内的日子是可以的。但现在我在显示天数(其中包括不在当年的天数)时遇到问题。例如,如果我输入目标日期为 2020 年 1 月 1 日,当前日期为 2019 年 9 月 30 日。它将返回 -272(天),这通常没有任何意义。
我尝试过在线理解和使用代码,但没有一个对我有用。
下面的代码的作用是返回剩余天数,但仅当这些天数在同一年内才有效。 labelledDate 变量是输入字符串 (dateStamp) 的一部分,仅显示格式为“dd MMMM yyyy”的日期。
// Show how many days left before event occurs
try {
String labeledDate = viewHolder.dateStamp.getText().toString().substring(5);
Calendar currentDay = Calendar.getInstance();
final Calendar targetDay = Calendar.getInstance();
SimpleDateFormat ourDateFormat = new SimpleDateFormat("dd MMMM yyyy", Locale.getDefault());
targetDay.setTime(ourDateFormat.parse(labeledDate));
if (targetDay.compareTo(currentDay) > 0) {
int daysLeft = targetDay.get(Calendar.DAY_OF_YEAR) - currentDay.get(Calendar.DAY_OF_YEAR);
if (daysLeft == 1) {
viewHolder.dayCounter.setText("Tomorrow");
}
else {
viewHolder.dayCounter.setText(daysLeft + " days");
}
}
else if (targetDay.compareTo(currentDay) == 0) {
viewHolder.dayCounter.setText("Today");
}
else {
viewHolder.dayCounter.setText("Expired");
}
} catch (ParseException e) {
Log.d("PARSE EXCEPTION", e.getMessage());
}
根据我目前对 Calendar.DAY_OF_YEAR 的理解,它由(可能)365 天组成。如果我输入日期 2020 年 1 月 1 日,它不会听年份,而只会关注日期和月份。因此,如果我输入目标日期为 2020 年 1 月 1 日,当前日期为 2019 年 9 月 30 日,那么从 1 月 1 日减去 9 月 30 日(忽略年份),它将返回 -272(天)。
我想要的是,如果我输入上面的内容,它将返回 93 天而不是 -272 天。任何可以帮助我实现这一目标的事情都会受到赞赏。
最佳答案
您的逻辑适用于同一年,只是因为 calendar.get(Calendar.DAY_OF_YEAR)
返回从 1 月 1 日到该年给定日期的天数。因此,在同一年的情况下,目标日期和当前日期将按预期工作。让我们通过一个例子来探讨一下
targetCalendar.set(2019, 11, 31);
System.out.println(currentCalendar.get(java.util.Calendar.DAY_OF_YEAR)); // Day of year since 1 Jan 2019, which is 273
System.out.println(targetCalendar.get(java.util.Calendar.DAY_OF_YEAR)); // Day of year since 1 Jan 2019, which is 365
// So your logic as per question works fine, gives 92 days (365 - 273) as result for below
System.out.println(targetCalendar.get(java.util.Calendar.DAY_OF_YEAR) - currentCalendar.get(java.util.Calendar.DAY_OF_YEAR));
// No lets change date for targetCalendar into next year
targetCalendar.set(2020, 0, 1);
System.out.println(currentCalendar.get(java.util.Calendar.DAY_OF_YEAR)); // Day of year since 1 Jan 2019, which is 273
System.out.println(targetCalendar.get(java.util.Calendar.DAY_OF_YEAR)); // Day of year since 1 Jan 2020, which is 1
// So your logic as per question works fine, gives -272 days (1 - 273) as result for below
System.out.println(targetCalendar.get(java.util.Calendar.DAY_OF_YEAR) - currentCalendar.get(java.util.Calendar.DAY_OF_YEAR));
希望你的逻辑有问题。
你可以通过这样做得到结果
long msDiff = targetDay.getTimeInMillis() - currentDay.getTimeInMillis();
long daysDiff = TimeUnit.MILLISECONDS.toDays(msDiff);
关于java - 如果天数包含另一年的天数,如何获得剩余天数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58162057/