计算纪念日
前言:某一天小白问大白我们结婚多久了,大白思索良久,拿出日历看了看,说到估计xxx天了吧,这时只见天空顿时灰暗(大白暗叫不好),一个巴掌最终还是拍响了。。。。。
分享一个自己耍朋友的时候用的纪念日计算工具案例吧。
测试:
java代码
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Scanner;
public class Live {
//控制台输入流
private Scanner cin = new Scanner(System.in);
public static void main(String[] args) throws ParseException {
Live l = new Live();
String time = l.infoStringDate();
while (!l.isDate(time)) {time = l.reInfoStringDate();}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(time);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int miss = l.infoMiss();
while (miss != -1) {
show(calendar, miss, date);
calendar.setTime(date);
miss = l.infoMiss();
}
System.out.println("欢迎下次使用");
}
/**
* 显示计算结果
* @param calendar
* @param miss
* @param date
*/
public static void show(Calendar calendar, int miss, Date date) {
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd EE");
calendar.add(Calendar.DATE, miss);
date = calendar.getTime();
System.out.println("请注意你们的" + miss + "天的纪念日是:" + sdf1.format(date));
}
public int infoMiss() {
System.out.println("输入特殊纪念时间(如:520,输入-1结束)");
return cin.nextInt();
}
/**
* 检查输入的时间是否满足格式要求
* @param date 时间字符串
* @return 是否满足要求
*/
public boolean isDate(String date) {
// 第一格式检查
boolean ok = date.matches("[1-9]{1}[0-9]{3}-(0[1-9]{1}|1[1-2]{1}|10)-[0-3]{1}[0-9]{1}");
// 第二日期校验
String[] data = date.split("[-/.+]");
ok = ok && isMonthAndDay(date);
return ok;
}
private boolean isMonthAndDay( String date ) {
String[] data = date.split("[-/.+]");
String month=data[1], day = data[2];
boolean ok = true;
//二月
if (month.matches("0[2]||2")) {
if(isRunYear(Integer.parseInt(data[0]))) {// 闰年
if (!day.matches("0[1-9]||[1-9]||1[0-9]||2[0-9]")) {
ok = false;
}
}else {// 非闰年
if (!day.matches("0[1-9]||[1-9]||1[0-9]||2[0-8]")) {
ok = false;
}
}
} else {// 2月份以外的大小月 【1大2小3大xxxx】
if (month.matches("0[13578]||[13578]||1[02]")) {//大月
if (!day.matches("0[1-9]||[1-9]||[12][0-9]||3[01]")) {
ok = false;// 天数不对
}
} else if (month.matches("0[469]||[469]||11")) {//小月
if (!day.matches("0[1-9]||[1-9]||[12][0-9]||30")) {
ok = false; // 天数不对
}
}
}
return ok;
}
public boolean isRunYear(int year) {
if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {// 是闰年
return true;
} else {return false;}
}
/**
* 输入初始时间,已字符串的格式输入
* @return 返回输入的字符串格式
*/
public String infoStringDate() {
System.out.println("请输入爱情开始的时间:格式(2016-01-07)");
return cin.nextLine();
}
public String reInfoStringDate() {
System.out.println("输入时间不符合要求,请按要求重新输入(格式:2016-01-07)");
return cin.nextLine();
}
}
代码未经专业测试,望指教。
畅想:集成一个短信,或者邮件提醒的服务,对用户指定特殊纪念日发送短信提醒(做大做强-)。