要求:
創(chuàng)新互聯(lián)建站是一家集網(wǎng)站建設(shè),清河企業(yè)網(wǎng)站建設(shè),清河品牌網(wǎng)站建設(shè),網(wǎng)站定制,清河網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,清河網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實用型網(wǎng)站。
用DateTimeFormatter實現(xiàn): 用掃描器獲取輸入的時間(年月日時分),這個時間的格式是常用的格式,然后格式化這個時間,把格式化的時間輸出到控制臺,可以在控制臺重復(fù)輸入時間.格式化的時間參考企業(yè)微信聊天記錄的展示時間
分析:
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號
則向前推一周到了上個月
也要考慮將其轉(zhuǎn)換為星期
4.先輸入一個時間,再對這個時間使用DateTimeFormatter進行格式化
比如:
輸入: 2020-1-11 12:22
則格式化結(jié)果為:
下午 12:22
代碼實現(xiàn)
程序開始:
package hrkj.chapter7.dateTimeFormatter.Test1; /** * 程序開始入口 <br> * 2020年1月9日下午7:10:04 * * @author wcf * @version 1.0 */ public class Test { /** * 程序入口 * * @param args 入口參數(shù) */ 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; /** * 有參構(gòu)造器 * * @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("日期時間錯誤!"), /** * 繼續(xù)或退出 */ CONTINUE_OR_QUIT("exit:程序退出\n請輸入:"), /** * 程序結(jié)束 */ END_OF_PROGRAM("退出成功,程序結(jié)束!"); /** * 提示 */ private final String str; /** * 有參構(gòu)造器 * * @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; /** * 有參數(shù)構(gòu)造器 * * @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(); /** * 靜態(tài)初始化塊 */ static { // 輸入提示 Hint.INPUT_DATE_TIME.println(); // 日期時間格式 Hint.DATETIMEFORMAT.println(); // 退出指令 Hint.CONTINUE_OR_QUIT.println(); } /** * 私有構(gòu)造器 */ private DateTimeFormatterTest() { // 私有構(gòu)造器 // 無法創(chuàng)建本類實例 } /** * 輸入日期時間 */ 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(); // 關(guān)閉掃描器 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 }; /** * 私有構(gòu)造器 */ private DateTimeFormatterTools() { // 私有構(gòu)造器,無法實例化 } /** * 處理輸入的日期時間 * * @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(":"); // 時間分割后的數(shù)組長度不是2則錯誤,因為輸入的的時間只有時和分 if (timeString.length != 2) { // 時間錯誤 Hint.INVOKE_TIME.println(); return; } // 日期分割后的數(shù)組長度不是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) { // 判斷是大月小月還是二月,如果當前天數(shù)是月份最后一天,則輸出明天 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) { // 判斷是大月小月還是二月,輸入的天數(shù)是不是月份的最后一天,是則是昨天 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則從當前天往前一周轉(zhuǎn)換為星期 if (currentDay >= 7) { // 輸出月日時分 printDateTime(MONTH_DAY_TIME, parse); // 如果當前天小于7,則當前天向前一周轉(zhuǎn)換為星期 } else if (Arrays.binarySearch(bigMonth, month) >= 0 && 31 - day + currentDay < 7) { // 年月日轉(zhuǎn)換為星期 printDateTime(WEEK_TIME, parse); } else if (Arrays.binarySearch(smallMonth, month) >= 0 && 30 - day + currentDay < 7) { // 年月日轉(zhuǎn)換為星期 printDateTime(WEEK_TIME, parse); } else if (month == 2) { // 判斷是閏年還是平年 if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) { if (29 - day + currentDay < 7) { // 年月日轉(zhuǎn)換為星期 printDateTime(WEEK_TIME, parse); } else { // 如果向前超出了一周輸出月日時分 printDateTime(MONTH_DAY_TIME, parse); } } else { if (28 - day + currentDay < 7) { // 年月日轉(zhuǎn)換為星期 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); } } /** * 格式化結(jié)果 * * @param pattern 模式字符串 * @param datetime 時間 */ private static void printDateTime(String pattern, LocalDateTime datetime) { // 通過模式字符串對時間進行格式化 DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern(pattern); // 打印格式化后的時間 System.out.println("格式化結(jié)果:\n\t" + ofPattern.format(datetime)); } }
代碼測試結(jié)果:
請輸入日期時間:
常用格式:xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
xxxx.xx.xx xx:xx
exit:程序退出
請輸入:
2020-1-11 12:22
格式化結(jié)果:
下午 12:22
exit:程序退出
請輸入:
2020-1-11 2:22
格式化結(jié)果:
上午 02:22
exit:程序退出
請輸入:
2020-1-10 1:22
格式化結(jié)果:
昨天 01:22
exit:程序退出
請輸入:
2020-1-7 12:22
格式化結(jié)果:
周二 12:22
exit:程序退出
請輸入:
2020-1-12 12:22
格式化結(jié)果:
明天 12:22
exit:程序退出
請輸入:
2020-1-13 12:22
格式化結(jié)果:
1月13日 12:22
exit:程序退出
請輸入:
2020-2-22 12:22
格式化結(jié)果:
2月22日 12:22
exit:程序退出
請輸入:
2019-12-31 12:22
格式化結(jié)果:
2019年12月31日 12:22
exit:程序退出
請輸入:
更多情況測試,或者代碼簡化,請自行探索測試
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
當前名稱:Java使用DateTimeFormatter格式化輸入的日期時間
網(wǎng)站網(wǎng)址:http://m.newbst.com/article6/jicgog.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、響應(yīng)式網(wǎng)站、企業(yè)建站、ChatGPT、網(wǎng)站營銷、自適應(yīng)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)