Calendar.DAY_OF_WEEK 和 Calendar.DAY_OF_MONTH 有什么区别?输出每次都一样

What is the Difference Between Calendar.DAY_OF_WEEK and Calendar.DAY_OF_MONTH? The output is same every time

我正在使用 Timestamp class 和当前时间设置时间。我用 Calendar class 设置时间,首先是 DAY_OF_WEEK,然后是 DAY_OF_MONTH。我每次都得到相同的输出。那么DAY_OF_MONTHDAY_OF_WEEK有什么区别呢?

    Timestamp followUpDateBegins = new Timestamp(System.currentTimeMillis());

    Calendar cal = Calendar.getInstance();
    cal.setTime(followUpDateBegins);
    cal.add(Calendar.DAY_OF_WEEK, -30);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    followUpDateBegins.setTime(cal.getTime().getTime());
    System.out.println("followUpDateBegins      "+followUpDateBegins);

    Timestamp followUpDateBeginsSecond = new Timestamp(System.currentTimeMillis());

    cal.setTime(followUpDateBeginsSecond);
    cal.add(Calendar.DAY_OF_MONTH, -30);
    cal.set(Calendar.HOUR, 0);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);
    cal.set(Calendar.MILLISECOND, 0);

    followUpDateBeginsSecond.setTime(cal.getTime().getTime());
    System.out.println("followUpDateBegins" + followUpDateBeginsSecond);

DAY_OF_WEEK 是星期几(7 天),DAY_OF_MONTH 是一个月中的第几天(<=31 天)

如果你使用 add

cal.add(Calendar.DAY_OF_WEEK, -30); 等同于 cal.add(Calendar.DAY_OF_MONTH, -30);

DATE 和 DAY_OF_YEAR 的作用相同 - 因为您在这两种情况下都修改了 Days,而您只是落后了 30 天。

但是,如果您的日历设置为 4 月 15 日,并且您这样做了 cal.get(Calendar.DAY_OF_MONTH)cal.get(Calendar.DAY_OF_WEEK) 他们会 return 不同的结果。

如其他答案中所述,添加两个字段会产生相同的日期,IMO,这是一个奇怪的实施细节。我们可以看到from the source code,有一个switch语句,在添加的时候两个字段都被认为是"the same":

case DAY_OF_MONTH: // synonym of DATE
case DAY_OF_YEAR:
case DAY_OF_WEEK:

尽管它没有意义 "adding days of week"(恕我直言 - 因为最后你只需添加 ,无论是在同一周、同一月还是无论如何,仅此而已),这就是它的实施方式。这个API真的很迷惑...

另一个细节是 Calendar.getInstance() 已经 returns 当前 date/time - it internally calls System.currentTimeMillis(), 所以创建一个 Timestamp 只是在日历中设置它是多余的。你可以这样做:

// create the calendar
Calendar cal = Calendar.getInstance();

// do your stuff
...

// create the timestamp
Timestamp followUpDateBeginsSecond = new Timestamp(cal.getTimeInMillis());