实现时间的计算: 要求用户输入身份证号,若格式有误,要求其重新输入。然后根据身份证号码输出20岁生日所在周的周三的日期

实现时间的计算: 要求用户输入身份证号,若格式有误,要求其重新输入。然后根据身份证号码输出20岁生日所在周的周三的日期(个人笔记,大佬勿喷)

package day03;


import java.util.Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 实现时间的计算: 要求用户输入身份证号,若格式有误,要求其重新输入。然后根据身份证号码输出20岁生日
 * 所在周的周三的日期。
 * 例如:
 * 出生日期:1998-07-15。
 * 20岁生日:2018-07-15
 * 当周的周三为:2018-07-18
 *
 */
public class Test05 {
	public static void main(String[] args) throws ParseException {
		Scanner input = new Scanner(System.in);
		System.out.println("请输入你的身份证号(格式你懂的):");
		String birthday = input.nextLine();
		
		//因为\\w单词字符是任何的字母,数字或者下划线字符,所以[^_]的作用是最后1位数可以是除掉"_"之外的单词字符
		String regex = "[\\d]{17}[\\w&&[^_]]{1}";
		Pattern pattern = Pattern.compile(regex );
			
		Matcher matcher = pattern.matcher(birthday);
		
		if (matcher.matches()) {  	
			//截取输入身份证的年月日
			int year = Integer.parseInt(birthday.substring(6, 10));
			int month = Integer.parseInt(birthday.substring(10, 12));
			int day = Integer.parseInt(birthday.substring(12, 14));
			System.out.println("你的生日是" + year + "年" + month + "月" + day + "日");
			
			//得到20岁生日当天的日期
			int TwentyBirthYear = year + 20;
			System.out.println("你的20岁生日是" + TwentyBirthYear + "年" + month + "月" + day + "日");
			
			
			//算出从生日那一年的1月1日起到20岁生日的那个月一共有多少天		
			
			//创建一个StringBuilder对象,目的是为了把截取到的年月日拼接到一起
			StringBuilder BirthDay = new StringBuilder();
		
			//这里year+20是为了获取出生起20年后的生日,-month和-day前的添加“-”是因为我们到时候转化为SimpleDateFormat的格式为
			//yyyy-MM-dd,如果不加parse转换不了.
			BirthDay.append(year + 20).append(-month).append(-day);		
			
			//因为parse只能转化为String类型,所以创一个BirthDay的String对象
			String BirthDayString = new String(BirthDay);
			
			SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");//日期格式
			
			Date BirthDate = simpleDateFormat.parse(BirthDayString);//把截取的日期字符串转换为日期格式
			
//			//创建一个Calendar对象。目的是为了引用DAY_OF_YEAR方法获取这一年的第几天
//			Calendar c = Calendar.getInstance();// 在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引
//			用,即内存中有一块区域专门用来存放静态方法和变量,可以直接使用,调用多次返回同一个对象。

//			c.setTime(BirthDate);
//			int BirthYearDays = c.get(Calendar.DAY_OF_YEAR);
//			System.out.println(BirthYearDays);
			
			//Date对象的getDay方法,根据本地时间,返回一个具体日期中一周的第几天。返回值从0~6,分别对应星期日~星期六。
			int week = BirthDate.getDay();
				
			switch (week) {
			case 0:
				System.out.println("你的20岁生日在本周的星期天!");
				
				if (day - 4 > 0) {//如果天数减去到星期三的天数大于0,说明还在本月,天数减去4天即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day-4) + "日");
				}else{//否则,说明还在上月,月份减一,减一后的月份天数减去超出的天数即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + (month-1) + "月" + (MonthDays(year,month - 1)- Math.abs(day - 4)) + "日");
				}
				break;
				
			case 1:
				System.out.println("你的20岁生日在本周的星期一!");
				System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day+2) + "日");
				break;
				
			case 2:
				System.out.println("你的20岁生日在本周的星期二!");
				System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day+1) + "日");
				break;
				
			case 3:
				System.out.println("你的20岁生日在本周的星期三!");
				System.out.println("所在的本周的星期三的日期就是今天:" + TwentyBirthYear + "年" + month + "月" + day + "日");
				break;
				
			case 4:
				System.out.println("你的20岁生日在本周的星期四!");
				if (day - 1 > 0) {//如果天数减去到星期三的天数大于0,说明还在本月,天数减去1天即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day-1) + "日");
				}else{//否则,说明还在上月,月份减一,减一后的月份天数减去超出的天数即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + (month-1) + "月" + (MonthDays(year,month - 1)- Math.abs(day - 1)) + "日");
				}
				break;
				
			case 5:
				System.out.println("你的20岁生日在本周的星期五!");
				if (day - 2 > 0) {//如果天数减去到星期三的天数大于0,说明还在本月,天数减去2天即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day-2) + "日");
				}else{//否则,说明还在上月,月份减一,减一后的月份天数减去超出的天数即可,Math.abs()取绝对值
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + (month-1) + "月" + (MonthDays(year,month - 1)- Math.abs(day - 2)) + "日");
				}
				break;
				
			case 6:
				System.out.println("你的20岁生日在本周的星期六!");
				if (day - 3 > 0) {//如果天数减去到星期三的天数大于0,说明还在本月,天数减去3天即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + month + "月" + (day-3) + "日");
				}else{//否则,说明还在上月,月份减一,减一后的月份天数减去超出的天数即可
					System.out.println("所在的本周的星期三的日期为:" + TwentyBirthYear + "年" + (month-1) + "月" + (MonthDays(year,month - 1)- Math.abs(day - 3)) + "日");
				}
				break;
				
			}
			
		}else {
			System.out.println("格式有误,请重新输入!");
		}
	}
	
	//用于获取每个月多少天的方法
	private static int MonthDays(int year, int month) {
		int days = 0;
		
		switch (month) {
		case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:days = 31;break;//以上几月为31天
		case 4:
		case 6:
		case 9:
		case 11:days = 30;break;//4,6,9,11为30天
		case 2:
			if ((year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0)) {
				days = 29;//闰年2月为29天
			}else {
				days = 28;//闰年2月为28天
			}	
		}
		
		return days;
	}
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值