Calendar.set不更改日历变量

时间:2018-03-21 06:00:44

标签: java java.util.calendar

我一直在为我的计算机编程课程编写一个程序而且我遇到了一些麻烦。说实话,我濒临疯狂......

它是一个日历程序,而我遇到问题的部分是java中的Calendar对象。这是我的方法之一的代码:

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 个答案:

答案 0 :(得分:1)

因此...

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

正在打印分配给Calendar.MONTHCalendar.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

部分混淆是因为您没有使用standard coding conventions for the Java Language,它指出所有全部大写(MONTH / DAY)都是常量的变量名称,他们不在你的代码中

而且,是的,因为我确定有些人必须指出,你不应该使用Calendar而是使用较新的java.time API,但如果您的老师想要你要使用它,我们是谁来反驳它们:/

答案 1 :(得分:0)

a very well-explained answer 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的代码更清晰易读,应该在学校教授什么。