-3

我正在使用Timestamp当前时间的课程设置时间。我CalendarDAY_OF_WEEK用. 再用DAY_OF_MONTH. 我每次都得到相同的输出。DAY_OF_MONTH那么和之间有什么区别DAY_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);
4

3 回答 3

4

如果你使用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)他们将返回不同的结果。

于 2018-04-10T09:24:58.347 回答
4

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

于 2018-04-10T09:20:25.670 回答
1

正如其他答案中所解释的,添加这两个字段会导致相同的日期,这是一个奇怪的实现细节,IMO。我们可以从源代码switch中看到,添加时两个字段都被视为“相同”的语句:

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

尽管“添加星期几”没有意义(恕我直言 - 因为最后你只是添加days,无论它是在同一周,一个月还是其他什么,就是这样),这就是它的实施方式。这个API真的很混乱......

另一个细节是Calendar.getInstance() 已经返回当前日期/时间-它在内部调用System.currentTimeMillis(),因此创建一个Timestamp只是为了在日历中设置它是多余的。你可以这样做:

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

// do your stuff
...

// create the timestamp
Timestamp followUpDateBeginsSecond = new Timestamp(cal.getTimeInMillis());
于 2018-04-10T12:58:12.467 回答