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
понятнее читать и чему учить в школах.