0

我一直在为我的计算机编程课编写一个程序,但遇到了一些麻烦。说实话,我快要疯了……

它是一个日历程序,我遇到问题的部分是 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();

}
4

2 回答 2

1

所以...

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

正在打印分配给Calendar.MONTHand的常量值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 Language 的标准编码约定,它声明所有大写 ( MONTH/ DAY) 都是常量的变量名,它们不在您的代码中

而且,是的,正如我确定有些人肯定会指出的那样,您不应该使用更新的 API,而是使用Calendar较新的java.timeAPI,但是如果您的老师希望您使用它,我们是谁来反驳他们:/

于 2018-03-21T07:30:12.600 回答
0

一个很好解释的答案中,MadProgrammer 问道:

而且,是的,正如我确定有些人肯定会指出的那样,您不应该使用更新的 API,而是使用Calendar较新的java.timeAPI,但是如果您的老师希望您使用它,我们是谁来反驳他们:/

我正在抓住机会。如果仅适用于不受相同限制的其他读者。老师不一样。当我教学时,每当学生找到与我想象的不同的解决方案时,我当然很感激。你更了解你的老师,所以我希望你知道在你的情况下什么是正确的,我当然不知道。

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更易于阅读,并且应该在学校教授什么。

于 2018-03-21T11:00:33.827 回答