日历减去一天不工作

Subtracting one day off Calendar doesn't work

我正在尝试使用 java.util.Calendar 构建一个简单的程序。尝试获取之前的工作日时,我的输出始终保持不变。代码和我在下面尝试的内容:

Calendar c = Calendar.getInstance();
        c.set(Calendar.MONTH, month);
        c.set(Calendar.DAY_OF_MONTH, day);
        c.set(Calendar.YEAR, year);
        int date = c.get(Calendar.DAY_OF_WEEK);
        return new SimpleDateFormat("EEEE").format(date).toUpperCase();

这是我一开始的代码。我试过一天减一天:

day = day-1;

我已经尝试将负一添加到 Day of Month 和 Day of week 字段:

c.add(Calendar.DAY_OF_WEEK, -1);
c.add(Calendar.DAY_OF_MONTH, -1);

我认为这与我的 SimpleDateFormat 有关,但我不确定。

I am trying to build a simple program with java.util.Calendar.

那是不可能的。具体来说, 'simple program' 部分。使用日历没有什么是简单的。

日历API太可怕了;它没有意义(一年的第一个月是...... 0,要更改值,你必须使用 int 常量,这不是惯用的 java),并且对它试图表示的内容感到困惑(不是日历,是date/time值,或者,是太阳耀斑时间,约会时间,还是闹钟时间?一头雾水,不知道)。这就是为什么有一个新的 API:java.time。 Java 不会删除东西,即使它已过时,因为那会破坏旧代码。因此,日历仍然存在这一事实并没有多大意义。

使用java.time.

I think that it has something to do with my SimpleDateFormat, but I am not sure.

没有。但是让我们忘记这个愚蠢的 API 并使用 java 时间来代替!

// note that in calendar, january is 0, and that is insane.
// in localdate, it is 1, which is sane.
// thus, assuming you have `month = month - 1;` someplace in your code...
// remove that.

LocalDate date = LocalDate.of(year, month, day);
DayOfWeek day = date.getDayOfWeek();
System.out.println(day);

想回去一天吗?好的

DayOfWeek day = date.minusDays(1).getDayOfWeek();
System.out.println(day);

失败的原因是您没有调用您认为的方法。没有SimpleDateFormat#format(int)。但是 SimpleDateFormat 扩展了 Format,后者声明了 Format#format(Object)。你的int被装箱到Integer然后Format#format(Object)中的相关代码是

    if (obj instanceof Date)
        return format( (Date)obj, toAppendTo, fieldPosition );
    else if (obj instanceof Number)
        return format( new Date(((Number)obj).longValue()),
                      toAppendTo, fieldPosition );
    else
        throw new IllegalArgumentException("Cannot format given Object as a Date");

此时,由于您传递的值被装箱到扩展 NumberIntegerif-elsesecond 分支被采用并且您的星期几值通过构造函数转换为日期。该数字被解释为毫秒值,当您减去 1 时,您将时间更改为 1 毫秒,而不是 1 天。

综上所述,您不应该使用 Calendar,请使用 java.time 包中的新 date/time API。