内容
随着生活节奏的加快,人们每天都面临的事务比较多样化,有时候可能会忘记一些重要的日程安排,例如会议,采访等。为了更好地管理和组织日常安排,要求编写一个日程安排管理程序,具体要求如下。
用户可以多次创建日程,但是最多只能创建20个,创建日程时包括日程的标题、日期和时间。要求日程的时间不能在当前时间之前。
创建完成后,程序按照日程时间由近及远,展示用户的所有日程信息,包括标题、日期、时间、目前距离这个日程还有多久(格式:x天x小时x分钟),以及日程的创建时间。
功能如下:
源代码如下:
package schedule;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.Duration;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner;
/**
* 日程类,表示一个日程项
*/
class Schedule {
private int id; // 日程唯一标识符
private String title; // 日程标题
private LocalDateTime dateTime; // 日程日期时间
private LocalDateTime createTime; // 日程创建时间
/**
* 构造函数
* @param id 日程ID
* @param title 日程标题
* @param dateTime 日程时间
*/
public Schedule(int id, String title, LocalDateTime dateTime) {
this.id = id;
this.title = title;
this.dateTime = dateTime;
this.createTime = LocalDateTime.now(); // 创建时间设置为当前时间
}
// 以下是getter和setter方法
public int getId() { return id; }
public String getTitle() { return title; }
public LocalDateTime getDateTime() { return dateTime; }
public LocalDateTime getCreateTime() { return createTime; }
public void setTitle(String title) { this.title = title; }
public void setDateTime(LocalDateTime dateTime) { this.dateTime = dateTime; }
}
/**
* 日程管理主类
*/
public class ScheduleManager {
private static int nextId = 1; // 下一个可用的日程ID
private static final int MAX_SCHEDULES = 20; // 最大日程数量限制
private static List schedules = new ArrayList<>(); // 存储所有日程的列表
private static Scanner scanner = new Scanner(System.in); // 用户输入扫描器
/**
* 主程序入口
* @param args 命令行参数
*/
public static void main(String[] args) {
boolean running = true; // 控制程序是否继续运行的标志
// 主循环
while (running) {
// 打印主菜单
System.out.println("--------日程安排管理程序--------");
System.out.println("1. 创建日程安排 2. 查看日程安排 3.编辑日程安排 4.删除日程安排");
System.out.print("请输入操作编号:");
int choice = scanner.nextInt();
// 根据用户选择执行不同操作
switch (choice) {
case 1:
createSchedule(); // 创建日程
break;
case 2:
viewSchedules(); // 查看日程
break;
case 3:
editSchedule(); // 编辑日程
break;
case 4:
deleteSchedule(); // 删除日程
break;
default:
System.out.println("无效操作编号,请重新输入!");
}
// 询问用户是否继续
System.out.print("您是否继续操作?(y/n): ");
String cont = scanner.next();
if (!cont.equalsIgnoreCase("y")) {
System.out.println("您已退出日程安排管理程序。");
running = false; // 结束程序
}
}
scanner.close(); // 关闭扫描器
}
/**
* 创建新日程
*/
private static void createSchedule() {
// 检查是否已达最大日程数
if (schedules.size() >= MAX_SCHEDULES) {
System.out.println("已达最大日程数(20个),不能再添加。");
return;
}
// 获取用户输入的标题
System.out.print("请输入标题:");
String title = scanner.next();
// 获取用户输入的日期和时间
System.out.print("请输入日期(格式:yyyy-MM-dd):");
String dateStr = scanner.next();
System.out.print("请输入时间(格式:HH:mm):");
String timeStr = scanner.next();
// 解析日期时间
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime dateTime;
try {
dateTime = LocalDateTime.parse(dateStr + " " + timeStr, dtf);
} catch (Exception e) {
System.out.println("日期或时间格式错误,请重新操作!");
return;
}
// 检查时间是否合法(不能早于当前时间)
if (dateTime.isBefore(LocalDateTime.now())) {
System.out.println("日程时间不能在当前时间之前,请重新操作!");
return;
}
// 创建并添加新日程
Schedule schedule = new Schedule(nextId++, title, dateTime);
schedules.add(schedule);
System.out.println("日程已添加!");
}
/**
* 查看所有日程
*/
private static void viewSchedules() {
// 检查是否有日程
if (schedules.isEmpty()) {
System.out.println("当前没有任何日程,查看结果为空,请先添加日程安排。");
return;
}
// 按时间排序日程
Collections.sort(schedules, Comparator.comparing(Schedule::getDateTime));
// 定义日期时间格式化器
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
DateTimeFormatter createFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS");
// 打印表头
System.out.println("当前所有日程安排如下:");
System.out.printf("%-4s%-20s%-20s%-20s%-25s\n",
"编号","标题", " 日期 时间", "距离现在", "创建时间");
// 遍历并打印每个日程
for (Schedule s : schedules) {
// 计算距离当前时间的时间差
Duration duration = Duration.between(LocalDateTime.now(), s.getDateTime());
long seconds = duration.getSeconds();
String diffStr = null;
if (seconds >= 0) {
// 将秒转换为天、小时、分钟
long days = seconds / (24 * 3600);
long hrs = (seconds % (24 * 3600)) / 3600;
long mins = (seconds % 3600) / 60;
diffStr = days + "天" + hrs + "小时" + mins + "分钟";
}
// 格式化输出日程信息
System.out.printf("%-6s%-20s%-20s%-20s%-25s\n",
s.getId(),
s.getTitle(),
dtf.format(s.getDateTime()),
diffStr,
createFormatter.format(s.getCreateTime())
);
}
}
/**
* 删除日程
*/
private static void deleteSchedule() {
// 检查是否有日程
if (schedules.isEmpty()) {
System.out.println("当前没有日程可以删除,请先添加日程安排。");
return;
}
// 获取要删除的日程ID
System.out.print("请输入要删除的日程编号:");
int id = scanner.nextInt();
boolean found = false;
// 遍历查找并删除
for (int i = 0; i < schedules.size(); i++) {
if (schedules.get(i).getId() == id) {
schedules.remove(i);
System.out.println("编号 "+id+" 日程安排已删除。");
found = true;
break;
}
}
// 如果未找到
if (!found) {
System.out.println("未找到对应编号的日程安排,无法删除,请先添加日程安排。");
}
}
/**
* 编辑日程
*/
private static void editSchedule() {
// 检查是否有日程
if (schedules.isEmpty()) {
System.out.println("当前没有日程可以编辑,请先添加日程安排。");
return;
}
// 获取要编辑的日程ID
System.out.print("请输入要编辑的日程编号:");
int id = scanner.nextInt();
boolean found = false;
// 遍历查找并编辑
for (Schedule s : schedules) {
if (s.getId() == id) {
// 获取新标题
System.out.print("请输入新标题:");
String newTitle = scanner.next();
// 获取新日期时间
System.out.print("请输入新日期(格式:yyyy-MM-dd):");
String dateStr = scanner.next();
System.out.print("请输入新时间(格式:HH:mm):");
String timeStr = scanner.next();
// 解析新日期时间
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
LocalDateTime newDateTime;
try {
newDateTime = LocalDateTime.parse(dateStr + " " + timeStr, dtf);
} catch (Exception e) {
System.out.println("日期或时间格式错误,编辑失败。");
return;
}
// 检查新时间是否合法
if (newDateTime.isBefore(LocalDateTime.now())) {
System.out.println("新时间不能在当前时间之前。");
return;
}
// 更新日程信息
s.setTitle(newTitle);
s.setDateTime(newDateTime);
System.out.println("日程已更新,编辑完成。");
found = true;
break;
}
}
// 如果未找到
if (!found) {
System.out.println("未找到对应编号的日程安排,无法编辑,请先添加日程安排。");
}
}
}
/*else {
// 负数:已过期 使用Math.abs()将负数变为正数,方便计算出“天”、“小时”、“分钟”。
long absSeconds = Math.abs(seconds); //使用Math.abs()避免负数影响。
long days = absSeconds / (24 * 3600);
long hrs = (absSeconds % (24 * 3600)) / 3600;
long mins = (absSeconds % 3600) / 60;
diffStr = "已过期(" + days + "天" + hrs + "小时" + mins + "分钟" + ")";
} */