Calendar.set не изменяет переменные календаря

Я работал над программой для своего класса по компьютерному программированию, и у меня возникли небольшие проблемы. По правде говоря, я нахожусь на грани безумия...

Это программа-календарь, и часть, с которой у меня проблемы, это объект Calendar в Java. Вот мой код для одного из методов:

public static void calendarGet(){
  String md = getInput("What date would you like to look at?(mm/dd)"); 
  int slash = md.indexOf('/');
  MDFromDate(md);

  cal.set(cal.MONTH, MONTH - 1); 
  cal.set(cal.DATE, DAY); 

  TARGET_DAY = DAY;
  MAX_DAY = cal.getActualMaximum(cal.DAY_OF_MONTH);
  WEEKS_IN_MONTH = MAX_DAY / 7;

  System.out.println(cal.MONTH + 1);
  System.out.println(cal.DAY_OF_MONTH);
  System.out.println(cal.getTime());

  drawMonth(cal.MONTH);

}

И выход для этого:

What date would you like to look at?(mm/dd)12/12
3
5
Wed Dec 12 22:47:32 PST 2018

Как видите, если я использую getTime(); он возвращает правильный месяц и день, но cal.MONTH и cal.DAY_OF_MONTH - нет.

Кроме того, когда я использую отладчик и смотрю в cal, ни одна из переменных не изменилась.

Я невероятно запутался, я был бы признателен за помощь!:D

РЕДАКТИРОВАТЬ:

public static String getInput(String prompt){
     System.out.print(prompt);
     Scanner inScan = new Scanner(System.in);
     return inScan.nextLine();
}

public static void MDFromDate(String md){
     Scanner getMD = new Scanner(md).useDelimiter("/");
     MONTH = getMD.nextInt();
     DAY = getMD.nextInt();

}

2 ответа

Так...

System.out.println(cal.MONTH + 1);
System.out.println(cal.DAY_OF_MONTH);

печатает постоянные значения, присвоенные Calendar.MONTH а также Calendar.DAY_OF_MONTHэто не значения, содержащиеся в Calendar Например, это просто значения, которые вы можете использовать для установки / получения значений Calendar

Итак, если вместо этого мы используем Calendar#get, например...

Calendar cal = Calendar.getInstance();

int month = 12;
int day = 12;

cal.set(cal.MONTH, month - 1);
cal.set(cal.DATE, day);

System.out.println(cal.get(Calendar.MONTH));
System.out.println(cal.get(Calendar.DATE));

Он напечатает...

11
12

Но подожди, почему 11потому что месяцы индексируются нулем (т.е. январь 0)

Частично путаница сводится к тому, что вы не используете стандартные соглашения о кодировании для языка Java, в котором указаны имена переменных, которые все в верхнем регистре (MONTH/DAY) являются константами, которых нет в вашем коде

И, да, как я уверен, некоторые из них должны указывать, вы не должны использовать Calendar но вместо новее java.time API, но если ваш учитель хочет, чтобы вы использовали его, кто мы такие, чтобы им противоречить: /

В очень хорошо объясненном ответе MadProgrammer спрашивает:

И, да, как я уверен, некоторые из них должны указывать, вы не должны использовать Calendar но вместо новее java.time API, но если ваш учитель хочет, чтобы вы использовали его, кто мы такие, чтобы им противоречить: /

Я пользуюсь шансом. Если только для других читателей, которые не подпадают под те же ограничения. Учителя разные. Когда я преподавал, я, конечно, ценил всякий раз, когда студенты находили решение, отличное от того, что я себе представлял. Вы знаете своего учителя лучше, поэтому я надеюсь, что вы знаете, что правильно в вашей ситуации, я, конечно, нет.

private static final DateTimeFormatter monthDayFormatter
        = DateTimeFormatter.ofPattern("M/d");

public static void calendarGet(){
      String md = getInput("What date would you like to look at?(mm/dd)");
      LocalDate date = MonthDay.parse(md, monthDayFormatter)
            .atYear(Year.now(ZoneId.of("America/Los_Angeles")).getValue());
      int targetDay = date.getDayOfMonth();
      int maxDay = date.lengthOfMonth();

      System.out.println(date.getMonth());
      System.out.println(date.getDayOfMonth());
}

Когда я вошел 04/05это напечатано

APRIL
5

ИМХО код использующий java.time понятнее читать и чему учить в школах.

Другие вопросы по тегам