从日历中减去一天不起作用

qhhrdooz  于 2021-06-27  发布在  Java
关注(0)|答案(3)|浏览(267)

我正在尝试用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;

我尝试过在“月日”和“周日”字段中都加上-1:

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

我想这和我的简单格式有关,但我不确定。

btxsgosb

btxsgosb1#

失败的原因是您没有调用您认为是的方法。根本没有 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");

此时,由于您传递的值被装箱到 Integer 延伸到 Number ,第二个分支 if-else 并通过构造函数将星期几值转换为日期。数字被解释为毫秒值,当你减去1,你改变了1毫秒,而不是1天的时间。
总之,你不应该使用 Calendar ,在中使用新的日期/时间api java.time 包裹。

ie3xauqp

ie3xauqp2#

从日历中获取星期几。

System.out.println(new SimpleDateFormat("EEEE").format(c.getTime()).toUpperCase());

从中减去一天 Calendar ,

c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) - 1);

完整演示

Calendar c = Calendar.getInstance();
c.set(Calendar.MONTH, Calendar.JANUARY);
c.set(Calendar.DAY_OF_MONTH, 4);
c.set(Calendar.YEAR, 2021);
System.out.println(new SimpleDateFormat("EEEE").format(c.getTime()).toUpperCase());
c.set(Calendar.DAY_OF_MONTH, c.get(Calendar.DAY_OF_MONTH) - 1);
System.out.println(new SimpleDateFormat("EEEE").format(c.getTime()).toUpperCase());
drkbr07n

drkbr07n3#

我正在尝试用java.util.calendar构建一个简单的程序。
那是不可能的。特别是“简单程序”部分。使用日历的事情并不简单。
日历api很糟糕;没道理(一年的第一个月是。。。0,要更改值,必须使用int常量,这不是惯用的java),并且对它试图表示的内容感到困惑(它不是日历,而是日期/时间值,或者,是吗?是日光浴时间、预约时间还是闹钟时间?它很困惑,不知道)。这就是为什么会有一个新的api: java.time . java不会删除过时的东西,因为这会破坏旧代码。所以,日历仍然存在并不意味着什么。
使用 java.time .
我想这和我的简单格式有关,但我不确定。
没有。但是让我们忘掉这个愚蠢的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);

相关问题