В чем разница между 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());