Java(NetBeans)日历开发问题:星期表头与年月显示异常
解决Java日历程序的三个常见问题
嘿,我刚看完你的问题,正好之前也折腾过类似的日历小工具,给你一步步拆解解决思路:
1. 让星期表头和日期正确对齐
首先,你得先单独打印星期表头,比如:
System.out.println("Sun Mon Tue Wed Thu Fri Sat");
接下来关键是计算当月第一天是星期几,然后在日期前面补足够的空格,让第一个日期刚好卡到表头的对应位置。用Calendar类的话可以这么做:
Calendar calendar = Calendar.getInstance(); calendar.set(year, month, 1); // 定位到当月第一天 int firstDayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); // 返回1=周日,2=周一...7=周六 // 根据第一天的星期数,打印前置空格(每个占位占4个字符,和日期格式对齐) for (int i = 1; i < firstDayOfWeek; i++) { System.out.print(" "); }
之后再开始循环打印当月的所有日期,这样日期就会乖乖对应到表头下面啦。
2. 修复重复打印每月第一天的问题
这个大概率是循环逻辑里的小疏忽——你可能在循环开始前先打印了一次第一天,然后循环里又重复打印了一遍。举个错误的例子:
// 错误示例:重复打印第一天 System.out.printf("%4d", calendar.get(Calendar.DATE)); // 先打了一次第一天 while (calendar.get(Calendar.MONTH) == month) { System.out.printf("%4d", calendar.get(Calendar.DATE)); // 循环里又打了一次 calendar.add(Calendar.DATE, 1); }
修正方法很简单,把前置的打印语句删掉,直接在循环里处理:
// 正确写法 while (calendar.get(Calendar.MONTH) == month) { System.out.printf("%4d", calendar.get(Calendar.DATE)); // 每打印7个日期换行,保持日历的网格格式 if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) { System.out.println(); } calendar.add(Calendar.DATE, 1); }
检查下你的代码里是不是有多余的打印第一天的语句,删掉就搞定了。
3. 在顶部显示月份和年份
这个超容易实现,只需要在打印星期表头之前,输出月份和年份的信息就行。用Calendar的getDisplayName可以拿到月份的英文全称:
// 先定位到当月第一天(假设你已经有year和month变量) calendar.set(year, month, 1); // 打印顶部标题,加个换行让格式更清爽 System.out.println("\n" + calendar.getDisplayName(Calendar.MONTH, Calendar.LONG, Locale.ENGLISH) + " " + calendar.get(Calendar.YEAR)); // 然后再打印星期表头和日期...
如果用的是Java 8+的LocalDate,代码会更简洁:
LocalDate date = LocalDate.of(year, month + 1, 1); // 注意LocalDate的月份是1-12 System.out.println("\n" + date.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH) + " " + date.getYear());
一定要确保这段代码只执行一次,别放在打印日期的循环里,不然每个日期上面都会重复打一遍年月。
要是还有格式对齐的小问题,你可以调整printf的占位符宽度,比如%4d是占4个字符,保证每个日期和表头的格子完全对应上。
内容的提问来源于stack exchange,提问作者Lounie Germain
相关产品推荐
相关产品推荐

