java - 如果天数包含另一年的天数,如何获得剩余天数?

标签 java android date calendar date-difference

我正在尝试实现一些可以倒计时事件发生前还剩多少天的东西。虽然处理同一年内的日子是可以的。但现在我在显示天数(其中包括不在当年的天数)时遇到问题。例如,如果我输入目标日期为 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/

相关文章:

java - 进口?使用包

java - 从字节数组创建 16 或 32 位图像

java - 需要合并两个 ByteArrayOutputStream 以生成单个 ByteArrayOutputStream

Android Http 从 Servlet 获取字符串数据

Python csv_writer : Change the output format of a oracle date column

java - 操作按钮未显示在 ActionBar 中

android - 如何使用 RxJava2 取消通话?

android - 将加速度计发送到 C/C++

ios - 在调整时区时将特定日期字符串转换为 Swift 3 日期

date - 比较 Google 电子表格中的日期