三天打鱼两天晒网
问题描述
中国有句俗语叫“三天打鱼两天晒网”。某人从2010年1月1日起开始“三天打鱼两天晒网”,问这个人在以后的某一天中是“打鱼”还是“晒网”。用编程语言实现程序解决问题。
基本要求
- 程序风格良好(使用自定义注释模板),提供友好的输入输出。
提高要求
- 输入数据的正确性验证。
- 使用文件进行数据测试。如将日期 2010-01-01、2011-12-14 等数据保存在in.txt文件中,程序读入in.dat文件进行判定,并将结果输出至out.txt文件。
程序流程图
算法分析
- 利用SimpleDateFormat将日期格式化为"yyyy-MM-dd"。
- 定义Date类对象,通过parse方法,将String类型的”2010-01-01”转换为Date类型。
- 利用while循环输入并校验目标日期是否合法,设置lenient为false,否则SimpleDateFormat会比较宽松地验证日期,比如2021/02/29会被接受,并转换成2021/03/01,当不合法时,抛出异常并重新输入,当合法时结束循环。
- 通过计算两个日期的毫秒数差,除以一天的毫秒数,即可得到两个日期相差的天数。
- 对5求余数,用来判断是在打鱼还是晒网,余数大于0小于4时在钓鱼,否则在晒网。
源代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
/**
* @author HYH
* @version 1.0
* @since 8
* @description 三天打鱼两天晒网
*/
public class FishDry {
//计算任意两个日期的天数差
public static long dayDifference(Date one, Date two) {
//通过计算两个日期的毫秒数差,除以一天的毫秒数,即可得到两个日期相差的天数
long difference = ((one.getTime() - two.getTime()) / (24 * 60 * 60 * 1000));
return Math.abs(difference);
}
public static void main(String[] args) throws ParseException {
//SimpleDateFormat将日期格式化为"yyyy-MM-dd"
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//定义Date类对象,通过parse方法,将String类型转换为Date类型
Date one = dateFormat.parse("2010-01-01");
Date two;
while (true) {
System.out.println("请输入查询日期(例2021-03-21):");
Scanner in = new Scanner(System.in);
String queryDay = in.nextLine();
try {
//设置lenient为false,否则SimpleDateFormat会比较宽松地验证日期
//比如2021/02/29会被接受,并转换成2021/03/01
dateFormat.setLenient(false);
//通过parse方法,将String类型转换为Date类型
two = dateFormat.parse(queryDay);
} catch (ParseException e) {
//参数日期不合法,捕获异常,重新输入
System.out.println("非法日期,请重新输入。");
continue;
}
//参数日期合法,结束循环
break;
}
//两日期相差天数,比实际判断所需天数少一天
long difference = dayDifference(one, two) + 1;
//对5求余数,用来判断是在打鱼还是晒网
long day = difference % 5;
if (day > 0 && day < 4) {
System.out.println("第" + difference + "天,他在打鱼。");
} else {
System.out.println("第" + difference + "天,他在晒网。");
}
}
}
测试
测试闰年
测试非合法日期
调试
心得体会
问题
- 如何验证日期的正确性。
- 如何计算两日期的天数差。
解决思路
- 设置lenient为false来验证日期正确性,否则SimpleDateFormat会比较宽松地验证日期,比如2021/02/29会被接受,并转换成2021/03/01,然后通过捕获异常的方法进行循环,使重新输入合法日期。
- 通过计算两个日期的毫秒数差,除以一天的毫秒数,即可得到两个日期相差的天数。