Java使用DateTimeFormatter格式化输入的日期时间
要求:
用DateTimeFormatter实现:用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台重复输入时间.格式化的时间参考企业微信聊天记录的展示时间
分析:
1.时间的常用格式为:
xxxx-xx-xxxx:xx
xxxx/xx/xxxx:xx
xxxx.xx.xxxx:xx
等格式
2.微信显式时间格式为:
今天显式:00:01-23:59;
昨天显式:昨天01:01;
前天显式:周几02:02
往前推一周都显式:周几02:02;
时间再往前推只显示:几月几日02:02
不同年则显式:几年几月几日02:02
也可考虑写一个明天显式:明天02:02
其余时间显式:几月几日02:02
3.考虑特殊情况下的日期:
比如当前天是1号
则上个月的最后一天是昨天
往前推一周则显式:星期几02:02
如果当前天不大于7号
则向前推一周到了上个月
也要考虑将其转换为星期
4.先输入一个时间,再对这个时间使用DateTimeFormatter进行格式化
比如:
输入:2020-1-1112:22
则格式化结果为:
下午12:22
代码实现
程序开始:
packagehrkj.chapter7.dateTimeFormatter.Test1; /** *程序开始入口
*2020年1月9日下午7:10:04 * *@authorwcf *@version1.0 */ publicclassTest{ /** *程序入口 * *@paramargs入口参数 */ publicstaticvoidmain(String[]args){ //程序开始运行 DateTimeFormatterTest.inoutDateTime(); } }
日期时间等需要用到的正则表达式:
packagehrkj.chapter7.dateTimeFormatter.Test1; /** *日期时间的正则表达式
*2020年1月9日下午7:25:11 * *@authorwcf *@version1.0 */ publicenumRegex{ /** *匹配闰年 */ LEEP_YEAR("((\\d{2}(0[48]|[2468][048]|[13579][26]))|((0[48]|[2468][048]|[13579][26])00))[-\\/\\.]0?2[-\\/\\.]29"), /** *匹配平年 */ COMMON_YEAR("(\\d{3}[1-9]|\\d{2}[1-9]\\d|\\d[1-9]\\d{2}|[1-9]\\d{3})[-\\/\\.]((0?[13578]|1[02])[-\\/\\.](0?[1-9]|[12]\\d|3[01])|((0?[469]|11)[-\\/\\.](0?[1-9]|[12]\\d|30))|(0?2[-\\/\\.](0?[1-9]|1\\d|2[0-8])))"), /** *匹配时间 */ TIME("([01]?\\d|2[0-3]):[0-5]?\\d"), /** *退出程序 */ EXIT("exit|退出"); /** *正则 */ privatefinalStringstr; /** *有参构造器 * *@paramstring正则 */ privateRegex(Stringstring){ this.str=string; } /** *获取正则 * *@return正则 */ publicStringgetStr(){ returnstr; } }
提示信息:
packagehrkj.chapter7.dateTimeFormatter.Test1; /** *提示信息
*2020年1月9日下午7:25:53 * *@authorwcf *@version1.0 */ publicenumHint{ /** *请输入日期时间 */ INPUT_DATE_TIME("请输入日期时间:"), /** *日期时间格式 */ DATETIMEFORMAT("常用格式:xxxx-xx-xxxx:xx\n\txxxx/xx/xxxx:xx\n\txxxx.xx.xxxx:xx"), /** *日期错误 */ INVOKE_DATE("日期错误"), /** *时间错误 */ INVOKE_TIME("时间错误"), /** *日期时间错误 */ INVOKE_DATE_TIME("日期时间错误!"), /** *继续或退出 */ CONTINUE_OR_QUIT("exit:程序退出\n请输入:"), /** *程序结束 */ END_OF_PROGRAM("退出成功,程序结束!"); /** *提示 */ privatefinalStringstr; /** *有参构造器 * *@paramstr提示 */ privateHint(Stringstr){ this.str=str; } /** *获取提示 */ publicvoidprintln(){ System.out.println(str); } }
日期时间格式化的模板字符串:
packagehrkj.chapter7.dateTimeFormatter.Test1; /** *日期时间格式化的模板字符串
*2019年3月1日下午7:17:19 * *@authorwcf *@version1.0 */ publicenumPattern{ /** *上下午时分 */ TIME("aHH:mm"), /** *昨天时分 */ YESTERDAY("昨天HH:mm"), /** *明天时分 */ TOMORROW("明天HH:mm"), /** *星期时分 */ WEEK_TIME("EHH:mm"), /** *月日时分 */ MONTH_DAY_TIME("M月d日HH:mm"), /** *年月日时分 */ YEAR_MONTH_DAY_TIME("y年M月d日HH:mm"); /** *显式模式 */ privatefinalStringstr; /** *有参数构造器 * *@paramstr模式 */ privatePattern(Stringstr){ this.str=str; } /** *获取显式模式 * *@return显式模式 */ publicStringgetStr(){ returnstr; } }
输入日期时间进行处理:
packagehrkj.chapter7.dateTimeFormatter.Test1; importjava.util.Scanner; /** *输入日期时间进行处理
*2020年1月9日下午7:09:31 * *@authorwcf *@version1.0 */ publicclassDateTimeFormatterTest{ /** *闰年正则 */ privatefinalstaticStringLEEP_YEAR=Regex.LEEP_YEAR.getStr(); /** *平年正则 */ privatefinalstaticStringCOMMON_YEAR=Regex.COMMON_YEAR.getStr(); /** *时间正则 */ privatefinalstaticStringTIME=Regex.TIME.getStr(); /** *退出正则 */ privatefinalstaticStringEXIT=Regex.EXIT.getStr(); /** *静态初始化块 */ static{ //输入提示 Hint.INPUT_DATE_TIME.println(); //日期时间格式 Hint.DATETIMEFORMAT.println(); //退出指令 Hint.CONTINUE_OR_QUIT.println(); } /** *私有构造器 */ privateDateTimeFormatterTest(){ //私有构造器 //无法创建本类实例 } /** *输入日期时间 */ publicstaticvoidinoutDateTime(){ //扫描器 Scannerscanner=newScanner(System.in); //扫描控制台输入 while(scanner.hasNextLine()){ //接收控制台输入,并去除输入前后的空格 Stringstr=scanner.nextLine().trim(); //对输入的字符进行判断 if(str.matches(EXIT)){ //程序退出 Hint.END_OF_PROGRAM.println(); //关闭扫描器 scanner.close(); //退出虚拟机 System.exit(0); //判断平闰年 }elseif(str.matches(LEEP_YEAR+TIME)||str.matches(COMMON_YEAR+TIME)){ //对输入的日期时间字符串进行格式化 DateTimeFormatterTools.format(str); //格式化后提示 Hint.CONTINUE_OR_QUIT.println(); }else{ //输入的日期时间不正确 Hint.INVOKE_DATE_TIME.println(); //输入提示 Hint.INPUT_DATE_TIME.println(); continue; } } } }
对输入的日期时间进行处理:
packagehrkj.chapter7.dateTimeFormatter.Test1; importjava.time.LocalDateTime; importjava.time.MonthDay; importjava.time.Year; importjava.time.format.DateTimeFormatter; importjava.util.Arrays; /** *对输入的日期时间进行处理
*2020年1月9日下午8:08:45 * *@authorwcf *@version1.0 */ publicclassDateTimeFormatterTools{ /** *年月日时分 */ privatestaticfinalStringYEAR_MONTH_DAY_TIME=Pattern.YEAR_MONTH_DAY_TIME.getStr(); /** *月日时分 */ privatestaticfinalStringMONTH_DAY_TIME=Pattern.MONTH_DAY_TIME.getStr(); /** *星期时分 */ privatestaticfinalStringWEEK_TIME=Pattern.WEEK_TIME.getStr(); /** *上下午时分 */ privatestaticfinalStringTIME=Pattern.TIME.getStr(); /** *昨天时分 */ privatestaticfinalStringYESTERDAY=Pattern.YESTERDAY.getStr(); /** *明天时分 */ privatestaticfinalStringTOMORROW=Pattern.TOMORROW.getStr(); /** *当前年 */ privatestaticintcurrentYear=Year.now().getValue(); /** *当前月 */ privatestaticintcurrentMonth=MonthDay.now().getMonthValue(); /** *当前日 */ privatestaticintcurrentDay=MonthDay.now().getDayOfMonth(); /** *大月 */ privatestaticint[]bigMonth={1,3,5,7,8,10,12}; /** *小月 */ privatestaticint[]smallMonth={4,6,9,11}; /** *私有构造器 */ privateDateTimeFormatterTools(){ //私有构造器,无法实例化 } /** *处理输入的日期时间 * *@paramstr输入的日期时间 */ publicstaticvoidformat(Stringstr){ //将日期和时间用空格进行分割 String[]datetime=str.split(""); //分割成的日期 Stringdate=datetime[0]; //分割成的时间 Stringtime=datetime[1]; //日期分割方式 Stringsplitter=""; //日期可以用-./进行分割 //如果包含了-./这三种中的一种,则用这些进行分割 if(date.contains(".")){ splitter="\\."; }elseif(date.contains("-")){ splitter="-"; }elseif(date.contains("/")){ splitter="/"; } //使用日期的分割方式对日期进行分割 String[]dateString=date.split(splitter); //使用:对时间进行分割,时间只能用:进行分割 String[]timeString=time.split(":"); //时间分割后的数组长度不是2则错误,因为输入的的时间只有时和分 if(timeString.length!=2){ //时间错误 Hint.INVOKE_TIME.println(); return; } //日期分割后的数组长度不是3则错误,因为输入的日期要有年,月和日 if(dateString.length!=3){ //日期错误 Hint.INVOKE_DATE.println(); return; } //输入的年 intyear=Integer.valueOf(dateString[0]); //输入的月 intmonth=Integer.valueOf(dateString[1]); //输入的日 intday=Integer.valueOf(dateString[2]); //输入的时 inthour=Integer.valueOf(timeString[0]); //输入的分 intminute=Integer.valueOf(timeString[1]); //对拆解判断过的字符串进行重新组合 Stringstr1=year+splitter+month+splitter+day+""+hour+":"+minute; //对组合后的字符串进行解析 DateTimeFormatterofPattern=DateTimeFormatter.ofPattern("y"+splitter+"M"+splitter+"d"+"H:m"); //将字符串解析成日期时间对象 LocalDateTimeparse=LocalDateTime.parse(str1,ofPattern); //同一年 if(year==currentYear){ //同一月 if(month==currentMonth){ //同一天 if(day==currentDay){ //今天 printDateTime(TIME,parse); }elseif(day-currentDay==1){ //明天 printDateTime(TOMORROW,parse); }elseif(day-currentDay==-1){ //昨天 printDateTime(YESTERDAY,parse); }elseif(day-currentDay>=-7&&day-currentDay<=-2){ //向前一周以星期来表示 printDateTime(WEEK_TIME,parse); }else{ //不同天 printDateTime(MONTH_DAY_TIME,parse); } //下个月 }elseif(month-currentMonth==1){ //如果输入的日是1,则判断当前月和天 if(day==1){ //判断是大月小月还是二月,如果当前天数是月份最后一天,则输出明天 if(Arrays.binarySearch(bigMonth,currentMonth)>=0&¤tDay==31){ //明天 printDateTime(TOMORROW,parse); return; }elseif(Arrays.binarySearch(smallMonth,currentMonth)>=0&¤tDay==30){ //明天 printDateTime(TOMORROW,parse); return; }elseif(currentMonth==2){ //判断输入的是闰年还是平年 if((year%4==0&&year%100!=0)||year%400==0){ if(currentDay==29){ //明天 printDateTime(TOMORROW,parse); return; } }else{ if(currentDay==28){ //明天 printDateTime(TOMORROW,parse); return; } } }else{ //使用月日进行输出 printDateTime(MONTH_DAY_TIME,parse); } }else{ //输入的日不是1,这输出月日时分 printDateTime(MONTH_DAY_TIME,parse); } //上一月 }elseif(month-currentMonth==-1){ //如果当前日是1,则判断输入日是否是上月最后一天 if(currentDay==1){ //判断是大月小月还是二月,输入的天数是不是月份的最后一天,是则是昨天 if(Arrays.binarySearch(bigMonth,month)>=0&&day==31){ //昨天 printDateTime(YESTERDAY,parse); return; }elseif(Arrays.binarySearch(smallMonth,month)>=0&&day==30){ //昨天 printDateTime(YESTERDAY,parse); return; }elseif(month==2){ //判断是闰年还是平年 if((year%4==0&&year%100!=0)||year%400==0){ if(day==29){ //昨天 printDateTime(YESTERDAY,parse); return; } }else{ if(day==28){ //昨天 printDateTime(YESTERDAY,parse); return; } } } } //如果当前日不小于7,则输入月日时分,小于7则从当前天往前一周转换为星期 if(currentDay>=7){ //输出月日时分 printDateTime(MONTH_DAY_TIME,parse); //如果当前天小于7,则当前天向前一周转换为星期 }elseif(Arrays.binarySearch(bigMonth,month)>=0&&31-day+currentDay<7){ //年月日转换为星期 printDateTime(WEEK_TIME,parse); }elseif(Arrays.binarySearch(smallMonth,month)>=0&&30-day+currentDay<7){ //年月日转换为星期 printDateTime(WEEK_TIME,parse); }elseif(month==2){ //判断是闰年还是平年 if((year%4==0&&year%100!=0)||year%400==0){ if(29-day+currentDay<7){ //年月日转换为星期 printDateTime(WEEK_TIME,parse); }else{ //如果向前超出了一周输出月日时分 printDateTime(MONTH_DAY_TIME,parse); } }else{ if(28-day+currentDay<7){ //年月日转换为星期 printDateTime(WEEK_TIME,parse); }else{ //如果向前超出了一周输出月日时分 printDateTime(MONTH_DAY_TIME,parse); } } }else{ //当前天向前超出了一周输出月日时分 printDateTime(MONTH_DAY_TIME,parse); } }else{ //不同月,输出月日时分 printDateTime(MONTH_DAY_TIME,parse); } }else{ //不同年,输出年月日时分 printDateTime(YEAR_MONTH_DAY_TIME,parse); } } /** *格式化结果 * *@parampattern模式字符串 *@paramdatetime时间 */ privatestaticvoidprintDateTime(Stringpattern,LocalDateTimedatetime){ //通过模式字符串对时间进行格式化 DateTimeFormatterofPattern=DateTimeFormatter.ofPattern(pattern); //打印格式化后的时间 System.out.println("格式化结果:\n\t"+ofPattern.format(datetime)); } }
代码测试结果:
请输入日期时间:
常用格式:xxxx-xx-xxxx:xx
xxxx/xx/xxxx:xx
xxxx.xx.xxxx:xx
exit:程序退出
请输入:
2020-1-1112:22
格式化结果:
下午12:22
exit:程序退出
请输入:
2020-1-112:22
格式化结果:
上午02:22
exit:程序退出
请输入:
2020-1-101:22
格式化结果:
昨天01:22
exit:程序退出
请输入:
2020-1-712:22
格式化结果:
周二12:22
exit:程序退出
请输入:
2020-1-1212:22
格式化结果:
明天12:22
exit:程序退出
请输入:
2020-1-1312:22
格式化结果:
1月13日12:22
exit:程序退出
请输入:
2020-2-2212:22
格式化结果:
2月22日12:22
exit:程序退出
请输入:
2019-12-3112:22
格式化结果:
2019年12月31日12:22
exit:程序退出
请输入:
更多情况测试,或者代码简化,请自行探索测试
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。