Java使用DateTimeFormatter格式化输入的日期时间
要求:
用datetimeformatter实现: 用扫描器获取输入的时间(年月日时分),这个时间的格式是常用的格式,然后格式化这个时间,把格式化的时间输出到控制台,可以在控制台重复输入时间.格式化的时间参考企业微信聊天记录的展示时间
分析:
1.时间的常用格式为:
xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
xxxx.xx.xx xx: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-11 12:22
则格式化结果为:
下午 12:22
代码实现
程序开始:
package hrkj.chapter7.datetimeformatter.test1; /** * 程序开始入口 <br> * 2020年1月9日下午7:10:04 * * @author wcf * @version 1.0 */ public class test { /** * 程序入口 * * @param args 入口参数 */ public static void main(string[] args) { // 程序开始运行 datetimeformattertest.inoutdatetime(); } }
日期时间等需要用到的正则表达式:
package hrkj.chapter7.datetimeformatter.test1; /** * 日期时间的正则表达式 <br> * 2020年1月9日下午7:25:11 * * @author wcf * @version 1.0 */ public enum regex { /** * 匹配闰年 */ 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|退出"); /** * 正则 */ private final string str; /** * 有参构造器 * * @param string 正则 */ private regex(string string) { this.str = string; } /** * 获取正则 * * @return 正则 */ public string getstr() { return str; } }
提示信息:
package hrkj.chapter7.datetimeformatter.test1; /** * 提示信息 <br> * 2020年1月9日下午7:25:53 * * @author wcf * @version 1.0 */ public enum hint { /** * 请输入日期时间 */ input_date_time("请输入日期时间:"), /** * 日期时间格式 */ datetimeformat("常用格式:xxxx-xx-xx xx:xx\n\t xxxx/xx/xx xx:xx\n\t xxxx.xx.xx xx:xx"), /** * 日期错误 */ invoke_date("日期错误"), /** * 时间错误 */ invoke_time("时间错误"), /** * 日期时间错误 */ invoke_date_time("日期时间错误!"), /** * 继续或退出 */ continue_or_quit("exit:程序退出\n请输入:"), /** * 程序结束 */ end_of_program("退出成功,程序结束!"); /** * 提示 */ private final string str; /** * 有参构造器 * * @param str 提示 */ private hint(string str) { this.str = str; } /** * 获取提示 */ public void println() { system.out.println(str); } }
日期时间格式化的模板字符串:
package hrkj.chapter7.datetimeformatter.test1; /** * 日期时间格式化的模板字符串 <br> * 2019年3月1日下午7:17:19 * * @author wcf * @version 1.0 */ public enum pattern { /** * 上下午时分 */ time("a hh:mm"), /** * 昨天 时分 */ yesterday("昨天 hh:mm"), /** * 明天 时分 */ tomorrow("明天 hh:mm"), /** * 星期 时分 */ week_time("e hh:mm"), /** * 月日时分 */ month_day_time("m月d日 hh:mm"), /** * 年月日时分 */ year_month_day_time("y年m月d日 hh:mm"); /** * 显式模式 */ private final string str; /** * 有参数构造器 * * @param str 模式 */ private pattern(string str) { this.str = str; } /** * 获取显式模式 * * @return 显式模式 */ public string getstr() { return str; } }
输入日期时间进行处理:
package hrkj.chapter7.datetimeformatter.test1; import java.util.scanner; /** * 输入日期时间进行处理 <br> * 2020年1月9日下午7:09:31 * * @author wcf * @version 1.0 */ public class datetimeformattertest { /** * 闰年正则 */ private final static string leep_year = regex.leep_year.getstr(); /** * 平年正则 */ private final static string common_year = regex.common_year.getstr(); /** * 时间正则 */ private final static string time = regex.time.getstr(); /** * 退出正则 */ private final static string exit = regex.exit.getstr(); /** * 静态初始化块 */ static { // 输入提示 hint.input_date_time.println(); // 日期时间格式 hint.datetimeformat.println(); // 退出指令 hint.continue_or_quit.println(); } /** * 私有构造器 */ private datetimeformattertest() { // 私有构造器 // 无法创建本类实例 } /** * 输入日期时间 */ public static void inoutdatetime() { // 扫描器 scanner scanner = new scanner(system.in); // 扫描控制台输入 while (scanner.hasnextline()) { // 接收控制台输入,并去除输入前后的空格 string str = scanner.nextline().trim(); // 对输入的字符进行判断 if (str.matches(exit)) { // 程序退出 hint.end_of_program.println(); // 关闭扫描器 scanner.close(); // 退出虚拟机 system.exit(0); // 判断平闰年 } else if (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; } } } }
对输入的日期时间进行处理:
package hrkj.chapter7.datetimeformatter.test1; import java.time.localdatetime; import java.time.monthday; import java.time.year; import java.time.format.datetimeformatter; import java.util.arrays; /** * 对输入的日期时间进行处理 <br> * 2020年1月9日下午8:08:45 * * @author wcf * @version 1.0 */ public class datetimeformattertools { /** * 年月日 时分 */ private static final string year_month_day_time = pattern.year_month_day_time.getstr(); /** * 月日 时分 */ private static final string month_day_time = pattern.month_day_time.getstr(); /** * 星期 时分 */ private static final string week_time = pattern.week_time.getstr(); /** * 上下午 时分 */ private static final string time = pattern.time.getstr(); /** * 昨天 时分 */ private static final string yesterday = pattern.yesterday.getstr(); /** * 明天 时分 */ private static final string tomorrow = pattern.tomorrow.getstr(); /** * 当前年 */ private static int currentyear = year.now().getvalue(); /** * 当前月 */ private static int currentmonth = monthday.now().getmonthvalue(); /** * 当前日 */ private static int currentday = monthday.now().getdayofmonth(); /** * 大月 */ private static int[] bigmonth = { 1, 3, 5, 7, 8, 10, 12 }; /** * 小月 */ private static int[] smallmonth = { 4, 6, 9, 11 }; /** * 私有构造器 */ private datetimeformattertools() { // 私有构造器,无法实例化 } /** * 处理输入的日期时间 * * @param str 输入的日期时间 */ public static void format(string str) { // 将日期和时间用空格进行分割 string[] datetime = str.split(" "); // 分割成的日期 string date = datetime[0]; // 分割成的时间 string time = datetime[1]; // 日期分割方式 string splitter = ""; // 日期可以用- . / 进行分割 // 如果包含了-./这三种中的一种,则用这些进行分割 if (date.contains(".")) { splitter = "\\."; } else if (date.contains("-")) { splitter = "-"; } else if (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; } // 输入的年 int year = integer.valueof(datestring[0]); // 输入的月 int month = integer.valueof(datestring[1]); // 输入的日 int day = integer.valueof(datestring[2]); // 输入的时 int hour = integer.valueof(timestring[0]); // 输入的分 int minute = integer.valueof(timestring[1]); // 对拆解判断过的字符串进行重新组合 string str1 = year + splitter + month + splitter + day + " " + hour + ":" + minute; // 对组合后的字符串进行解析 datetimeformatter ofpattern = datetimeformatter.ofpattern("y" + splitter + "m" + splitter + "d" + " h:m"); // 将字符串解析成日期时间对象 localdatetime parse = localdatetime.parse(str1, ofpattern); // 同一年 if (year == currentyear) { // 同一月 if (month == currentmonth) { // 同一天 if (day == currentday) { // 今天 printdatetime(time, parse); } else if (day - currentday == 1) { // 明天 printdatetime(tomorrow, parse); } else if (day - currentday == -1) { // 昨天 printdatetime(yesterday, parse); } else if (day - currentday >= -7 && day - currentday <= -2) { // 向前一周以星期来表示 printdatetime(week_time, parse); } else { // 不同天 printdatetime(month_day_time, parse); } // 下个月 } else if (month - currentmonth == 1) { // 如果输入的日是1,则判断当前月和天 if (day == 1) { // 判断是大月小月还是二月,如果当前天数是月份最后一天,则输出明天 if (arrays.binarysearch(bigmonth, currentmonth) >= 0 && currentday == 31) { // 明天 printdatetime(tomorrow, parse); return; } else if (arrays.binarysearch(smallmonth, currentmonth) >= 0 && currentday == 30) { // 明天 printdatetime(tomorrow, parse); return; } else if (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); } // 上一月 } else if (month - currentmonth == -1) { // 如果当前日是1,则判断输入日是否是上月最后一天 if (currentday == 1) { // 判断是大月小月还是二月,输入的天数是不是月份的最后一天,是则是昨天 if (arrays.binarysearch(bigmonth, month) >= 0 && day == 31) { // 昨天 printdatetime(yesterday, parse); return; } else if (arrays.binarysearch(smallmonth, month) >= 0 && day == 30) { // 昨天 printdatetime(yesterday, parse); return; } else if (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,则当前天向前一周转换为星期 } else if (arrays.binarysearch(bigmonth, month) >= 0 && 31 - day + currentday < 7) { // 年月日转换为星期 printdatetime(week_time, parse); } else if (arrays.binarysearch(smallmonth, month) >= 0 && 30 - day + currentday < 7) { // 年月日转换为星期 printdatetime(week_time, parse); } else if (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); } } /** * 格式化结果 * * @param pattern 模式字符串 * @param datetime 时间 */ private static void printdatetime(string pattern, localdatetime datetime) { // 通过模式字符串对时间进行格式化 datetimeformatter ofpattern = datetimeformatter.ofpattern(pattern); // 打印格式化后的时间 system.out.println("格式化结果:\n\t" + ofpattern.format(datetime)); } }
代码测试结果:
请输入日期时间:
常用格式:xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
xxxx.xx.xx xx:xx
exit:程序退出
请输入:
2020-1-11 12:22
格式化结果:
下午 12:22
exit:程序退出
请输入:
2020-1-11 2:22
格式化结果:
上午 02:22
exit:程序退出
请输入:
2020-1-10 1:22
格式化结果:
昨天 01:22
exit:程序退出
请输入:
2020-1-7 12:22
格式化结果:
周二 12:22
exit:程序退出
请输入:
2020-1-12 12:22
格式化结果:
明天 12:22
exit:程序退出
请输入:
2020-1-13 12:22
格式化结果:
1月13日 12:22
exit:程序退出
请输入:
2020-2-22 12:22
格式化结果:
2月22日 12:22
exit:程序退出
请输入:
2019-12-31 12:22
格式化结果:
2019年12月31日 12:22
exit:程序退出
请输入:
更多情况测试,或者代码简化,请自行探索测试
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
推荐阅读
-
Java日期时间API系列12-----Jdk8中java.time包中的新的日期时间API类,日期格式化,常用日期格式大全
-
Java使用DateTimeFormatter实现格式化时间
-
Java日期时间API系列11-----Jdk8中java.time包中的新的日期时间API类,使用java8日期时间API重写农历LunarDate
-
Java使用DateTimeFormatter格式化输入的日期时间
-
PowerShell中使用Get-Date获取日期时间并格式化输出的例子
-
为什么不建议使用Date,而是使用Java8新的时间和日期API?
-
Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
-
解决Spring Boot和Feign中使用Java 8时间日期API(LocalDate等)的序列化问题
-
使用Python将字符串转换为格式化的日期时间字符串
-
使用Smarty 获取当前日期时间和格式化日期时间的方法详解