作为一名有十年Java开发经验的工程师,我经常被问到如何实现一个简单的可视化日历程序。这看似基础的功能,实际上涵盖了日期处理、控制台输出格式化和用户交互等多个核心知识点。今天我就带大家手把手实现这个项目,并分享一些教科书上不会讲的实战技巧。
首先确保你已经安装:
提示:虽然现代Java已经发展到JDK 21,但考虑到企业环境兼容性,建议初学者从JDK 8或11开始学习。
我们需要用到以下Java核心类:
java.util.Calendar:日期操作核心类java.text.SimpleDateFormat:日期格式化java.util.Scanner:控制台输入处理java复制SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Scanner scanner = new Scanner(System.in);
System.out.println("请输入日期(格式:2023-03-15)");
String input = scanner.nextLine();
// 日期格式验证
while (!input.matches("\\d{4}-\\d{1,2}-\\d{1,2}")) {
System.out.println("格式错误,请重新输入(示例:2023-03-15)");
input = scanner.nextLine();
}
这段代码有几个关键点:
java复制Calendar cal = Calendar.getInstance();
cal.setTime(sdf.parse(input));
int currentDay = cal.get(Calendar.DAY_OF_MONTH);
int maxDays = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
// 打印表头
System.out.println("日\t一\t二\t三\t四\t五\t六");
// 定位当月第一天是周几
cal.set(Calendar.DAY_OF_MONTH, 1);
int firstDayOfWeek = cal.get(Calendar.DAY_OF_WEEK);
// 打印首行缩进
for (int i = 1; i < firstDayOfWeek; i++) {
System.out.print("\t");
}
// 打印日历主体
for (int day = 1; day <= maxDays; day++) {
String output = (day == currentDay) ? day + "*" : String.valueOf(day);
System.out.print(output + "\t");
// 周六换行
if (cal.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY) {
System.out.println();
}
cal.add(Calendar.DAY_OF_MONTH, 1);
}
java复制// 中文星期显示
String[] weekDays = {"日", "一", "二", "三", "四", "五", "六"};
System.out.println(String.join("\t", weekDays));
// 英文版本
String[] enWeekDays = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
java复制System.out.println("← 上月 [M] 下月 →");
String cmd = scanner.next();
if (cmd.equalsIgnoreCase("M")) {
cal.add(Calendar.MONTH, -1);
} else {
cal.add(Calendar.MONTH, 1);
}
java复制// 时区问题解决方案
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
java复制// 使用StringBuilder替代直接打印
StringBuilder sb = new StringBuilder();
sb.append("日\t一\t二\t三\t四\t五\t六\n");
// ...后续拼接逻辑
System.out.print(sb.toString());
考虑使用JavaFX或Swing实现GUI版本:
java复制// 使用Properties存储用户偏好
Properties props = new Properties();
props.setProperty("lastView", sdf.format(cal.getTime()));
try (OutputStream out = new FileOutputStream("calendar.cfg")) {
props.store(out, "Calendar Preferences");
}
日期处理:
用户交互:
代码结构:
异常处理:
java复制// 改进后的异常处理
try {
Date date = sdf.parse(input);
cal.setTime(date);
} catch (ParseException e) {
System.err.println("日期解析错误:" + e.getMessage());
return;
}
这个看似简单的日历项目,实际上涵盖了Java开发的多个重要概念。建议初学者在完成基础功能后,尝试实现扩展功能,这将大大提升你的实战能力。
记住,优秀的开发者不仅要让代码能运行,还要考虑:
当你能够全面考虑这些问题时,你的编程水平就已经超越了大多数初学者。