В чем разница между Calendar.DAY_OF_WEEK и Calendar.DAY_OF_MONTH? Выход один и тот же каждый раз

Я устанавливаю время, используя Timestamp класс с текущим временем. Я устанавливаю время с Calendar класс первым DAY_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);

3 ответа

Решение

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 дней.

Но если ваш календарь установлен на 15 апреля, например, и вы делаетеcal.get(Calendar.DAY_OF_MONTH) а также cal.get(Calendar.DAY_OF_WEEK) они будут возвращать разные результаты.

Как объяснено в других ответах, добавление обоих полей приводит к одной и той же дате, что является странной деталью реализации, IMO. Мы можем видеть это из исходного кода, есть switch оператор, в котором оба поля считаются "одинаковыми" при добавлении:

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

Хотя не имеет смысла "добавлять дни недели" (ИМХО - потому что, в конце концов, вы просто добавляете дни, независимо от того, совпадают ли они с одной и той же неделей, месяцем или чем-то еще, и все), это способ реализации. Этот 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());
Другие вопросы по тегам