当我修改 CalendarView 的选定日期时,我得到了一个负数月份和 31 天以上的月份

When i modified the selected date of the CalendarView I got a negative month and 31+ days in month

我尝试获取用户 select 编辑的自定义日期的前一个日期,但我找不到方法来做到这一点 这是代码


 calendar.setOnDateChangeListener(new CalendarView.OnDateChangeListener() {
            @Override
            public void onSelectedDayChange( @NonNull CalendarView view, int year, int month, int dayOfMonth ) {
                finalDate = (dayOfMonth + 7) + "/" + (month - 3) + "/" + year;

                try {
                    Date date = new SimpleDateFormat("dd/MM/yyyy").parse(finalDate);


                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        });

所以如果我 select 30/2/2020 结果是:(37/-1/2020)

这不是因为您要将天数加 7 并从月数中减去 3 吗?尝试删除它,它应该会更好。

java.time 和 ThreeTenABP

考虑使用 java.time,现代 Java 日期和时间 API,作为你的约会工作。尤其是当你需要计算日期时。坦率地说,我发现它比旧的和过时的 Calendar class 更适合,更不用说 DateSimpleDateFormat.

    int year = 2020;
    int month = Calendar.MARCH; // For demonstration only, don’t use Calendar in your code
    int dayOfMonth = 30;
    
    LocalDate selectedDate = LocalDate.of(year, month + 1, dayOfMonth);
    LocalDate finalDate = selectedDate.minusMonths(3).plusDays(7);
    
    System.out.println(finalDate);

输出:

2020-01-06

我相信您的 Android 日期选择器从 1 月的 0 到 12 月的 11 数字月份,因此我们需要加 1 以转换为人类和 LocalDate 数字月份的自然方式。当我们从 3 月 30 日开始时,我们减去 3 个月得到 12 月 30 日,然后加上 7 天得到 1 月 6 日。我们也可能以相反的顺序进行数学运算:

    LocalDate finalDate = selectedDate.plusDays(7).minusMonths(3);

在这种情况下,它给出了相同的结果,但由于月份的长度不等,所以不会总是这样。