Calendar.DAY_OF_WEEK和Calendar.DAY_OF_MONTH之间有什么区别?每次输出都相同

时间:2018-04-10 09:18:06

标签: java date java.util.calendar

我正在使用当前时间的Timestamp课程来设置时间。我的Calendar课程的时间先是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);

OR

    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);

3 个答案:

答案 0 :(得分:3)

如果您使用add

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

相同

DATE和DAY_OF_YEAR的行为也是一样的 - 因为你在两种情况下修改了天数而你只是落后了30天。

但是如果您的日历设置为4月15日,那么您可以这样做 cal.get(Calendar.DAY_OF_MONTH)cal.get(Calendar.DAY_OF_WEEK)他们会返回不同的结果。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

正如其他答案中所解释的那样,添加两个字段会产生相同的日期,这是一个奇怪的实现细节,IMO。我们可以看到from the source code,有一个switch语句,其中两个字段在添加时被视为“相同”:

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

Alghough没有意义“添加星期几”(恕我直言 - 因为最后你只需添加,无论是在同一周,一个月或其他什么地方,那都是它,这就是它实施的方式。这个API真的令人困惑......

另一个细节是,Calendar.getInstance() 已经返回当前日期/时间 - 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());