Java使用DateTimeFormatter格式化輸入的日期時(shí)間
要求:
用DateTimeFormatter實(shí)現(xiàn): 用掃描器獲取輸入的時(shí)間(年月日時(shí)分),這個(gè)時(shí)間的格式是常用的格式,然后格式化這個(gè)時(shí)間,把格式化的時(shí)間輸出到控制臺(tái),可以在控制臺(tái)重復(fù)輸入時(shí)間.格式化的時(shí)間參考企業(yè)微信聊天記錄的展示時(shí)間
分析:
1.時(shí)間的常用格式為:
xxxx-xx-xx xx:xx
xxxx/xx/xx xx:xx
xxxx.xx.xx xx:xx
等格式
2.微信顯式時(shí)間格式為:
今天顯式: 00:01 - 23:59 ;
昨天顯式: 昨天 01:01 ;
前天顯式: 周幾 02:02
往前推一周都顯式: 周幾 02:02 ;
時(shí)間再往前推只顯示: 幾月幾日 02:02
不同年則顯式: 幾年幾月幾日 02:02
也可考慮寫一個(gè)明天顯式: 明天 02:02
其余時(shí)間顯式: 幾月幾日 02:02
3.考慮特殊情況下的日期:
比如當(dāng)前天是1號(hào)
則上個(gè)月的最后一天是昨天
往前推一周則顯式:星期幾 02:02
如果當(dāng)前天不大于7號(hào)
則向前推一周到了上個(gè)月
也要考慮將其轉(zhuǎn)換為星期
4.先輸入一個(gè)時(shí)間,再對這個(gè)時(shí)間使用DateTimeFormatter進(jìn)行格式化
比如:
輸入: 2020-1-11 12:22
則格式化結(jié)果為:
下午 12:22
代碼實(shí)現(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) {
// 程序開始運(yùn)行
DateTimeFormatterTest.inoutDateTime();
}
}
日期時(shí)間等需要用到的正則表達(dá)式:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* 日期時(shí)間的正則表達(dá)式 <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])))"),
/**
* 匹配時(shí)間
*/
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 {
/**
* 請輸入日期時(shí)間
*/
INPUT_DATE_TIME("請輸入日期時(shí)間:"),
/**
* 日期時(shí)間格式
*/
DATETIMEFORMAT("常用格式:xxxx-xx-xx xx:xx\n\t xxxx/xx/xx xx:xx\n\t xxxx.xx.xx xx:xx"),
/**
* 日期錯(cuò)誤
*/
INVOKE_DATE("日期錯(cuò)誤"),
/**
* 時(shí)間錯(cuò)誤
*/
INVOKE_TIME("時(shí)間錯(cuò)誤"),
/**
* 日期時(shí)間錯(cuò)誤
*/
INVOKE_DATE_TIME("日期時(shí)間錯(cuò)誤!"),
/**
* 繼續(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);
}
}
日期時(shí)間格式化的模板字符串:
package hrkj.chapter7.dateTimeFormatter.Test1;
/**
* 日期時(shí)間格式化的模板字符串 <br>
* 2019年3月1日下午7:17:19
*
* @author wcf
* @version 1.0
*/
public enum Pattern {
/**
* 上下午時(shí)分
*/
TIME("a HH:mm"),
/**
* 昨天 時(shí)分
*/
YESTERDAY("昨天 HH:mm"),
/**
* 明天 時(shí)分
*/
TOMORROW("明天 HH:mm"),
/**
* 星期 時(shí)分
*/
WEEK_TIME("E HH:mm"),
/**
* 月日時(shí)分
*/
MONTH_DAY_TIME("M月d日 HH:mm"),
/**
* 年月日時(shí)分
*/
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;
}
}
輸入日期時(shí)間進(jìn)行處理:
package hrkj.chapter7.dateTimeFormatter.Test1;
import java.util.Scanner;
/**
* 輸入日期時(shí)間進(jìn)行處理 <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();
/**
* 時(shí)間正則
*/
private final static String TIME = Regex.TIME.getStr();
/**
* 退出正則
*/
private final static String EXIT = Regex.EXIT.getStr();
/**
* 靜態(tài)初始化塊
*/
static {
// 輸入提示
Hint.INPUT_DATE_TIME.println();
// 日期時(shí)間格式
Hint.DATETIMEFORMAT.println();
// 退出指令
Hint.CONTINUE_OR_QUIT.println();
}
/**
* 私有構(gòu)造器
*/
private DateTimeFormatterTest() {
// 私有構(gòu)造器
// 無法創(chuàng)建本類實(shí)例
}
/**
* 輸入日期時(shí)間
*/
public static void inoutDateTime() {
// 掃描器
Scanner scanner = new Scanner(System.in);
// 掃描控制臺(tái)輸入
while (scanner.hasNextLine()) {
// 接收控制臺(tái)輸入,并去除輸入前后的空格
String str = scanner.nextLine().trim();
// 對輸入的字符進(jìn)行判斷
if (str.matches(EXIT)) {
// 程序退出
Hint.END_OF_PROGRAM.println();
// 關(guān)閉掃描器
scanner.close();
// 退出虛擬機(jī)
System.exit(0);
// 判斷平閏年
} else if (str.matches(LEEP_YEAR + TIME) || str.matches(COMMON_YEAR + TIME)) {
// 對輸入的日期時(shí)間字符串進(jìn)行格式化
DateTimeFormatterTools.format(str);
// 格式化后提示
Hint.CONTINUE_OR_QUIT.println();
} else {
// 輸入的日期時(shí)間不正確
Hint.INVOKE_DATE_TIME.println();
// 輸入提示
Hint.INPUT_DATE_TIME.println();
continue;
}
}
}
}
對輸入的日期時(shí)間進(jìn)行處理:
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;
/**
* 對輸入的日期時(shí)間進(jìn)行處理 <br>
* 2020年1月9日下午8:08:45
*
* @author wcf
* @version 1.0
*/
public class DateTimeFormatterTools {
/**
* 年月日 時(shí)分
*/
private static final String YEAR_MONTH_DAY_TIME = Pattern.YEAR_MONTH_DAY_TIME.getStr();
/**
* 月日 時(shí)分
*/
private static final String MONTH_DAY_TIME = Pattern.MONTH_DAY_TIME.getStr();
/**
* 星期 時(shí)分
*/
private static final String WEEK_TIME = Pattern.WEEK_TIME.getStr();
/**
* 上下午 時(shí)分
*/
private static final String TIME = Pattern.TIME.getStr();
/**
* 昨天 時(shí)分
*/
private static final String YESTERDAY = Pattern.YESTERDAY.getStr();
/**
* 明天 時(shí)分
*/
private static final String TOMORROW = Pattern.TOMORROW.getStr();
/**
* 當(dāng)前年
*/
private static int currentYear = Year.now().getValue();
/**
* 當(dāng)前月
*/
private static int currentMonth = MonthDay.now().getMonthValue();
/**
* 當(dāng)前日
*/
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)造器,無法實(shí)例化
}
/**
* 處理輸入的日期時(shí)間
*
* @param str 輸入的日期時(shí)間
*/
public static void format(String str) {
// 將日期和時(shí)間用空格進(jìn)行分割
String[] datetime = str.split(" ");
// 分割成的日期
String date = datetime[0];
// 分割成的時(shí)間
String time = datetime[1];
// 日期分割方式
String splitter = "";
// 日期可以用- . / 進(jìn)行分割
// 如果包含了-./這三種中的一種,則用這些進(jìn)行分割
if (date.contains(".")) {
splitter = "\\.";
} else if (date.contains("-")) {
splitter = "-";
} else if (date.contains("/")) {
splitter = "/";
}
// 使用日期的分割方式對日期進(jìn)行分割
String[] dateString = date.split(splitter);
// 使用:對時(shí)間進(jìn)行分割,時(shí)間只能用:進(jìn)行分割
String[] timeString = time.split(":");
// 時(shí)間分割后的數(shù)組長度不是2則錯(cuò)誤,因?yàn)檩斎氲牡臅r(shí)間只有時(shí)和分
if (timeString.length != 2) {
// 時(shí)間錯(cuò)誤
Hint.INVOKE_TIME.println();
return;
}
// 日期分割后的數(shù)組長度不是3則錯(cuò)誤,因?yàn)檩斎氲娜掌谝心?月和日
if (dateString.length != 3) {
// 日期錯(cuò)誤
Hint.INVOKE_DATE.println();
return;
}
// 輸入的年
int year = Integer.valueOf(dateString[0]);
// 輸入的月
int month = Integer.valueOf(dateString[1]);
// 輸入的日
int day = Integer.valueOf(dateString[2]);
// 輸入的時(shí)
int hour = Integer.valueOf(timeString[0]);
// 輸入的分
int minute = Integer.valueOf(timeString[1]);
// 對拆解判斷過的字符串進(jìn)行重新組合
String str1 = year + splitter + month + splitter + day + " " + hour + ":" + minute;
// 對組合后的字符串進(jìn)行解析
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern("y" + splitter + "M" + splitter + "d" + " H:m");
// 將字符串解析成日期時(shí)間對象
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);
}
// 下個(gè)月
} else if (month - currentMonth == 1) {
// 如果輸入的日是1,則判斷當(dāng)前月和天
if (day == 1) {
// 判斷是大月小月還是二月,如果當(dāng)前天數(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 {
// 使用月日進(jìn)行輸出
printDateTime(MONTH_DAY_TIME, parse);
}
} else {
// 輸入的日不是1,這輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
}
// 上一月
} else if (month - currentMonth == -1) {
// 如果當(dāng)前日是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;
}
}
}
}
// 如果當(dāng)前日不小于7,則輸入月日時(shí)分,小于7則從當(dāng)前天往前一周轉(zhuǎn)換為星期
if (currentDay >= 7) {
// 輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
// 如果當(dāng)前天小于7,則當(dāng)前天向前一周轉(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 {
// 如果向前超出了一周輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
}
} else {
if (28 - day + currentDay < 7) {
// 年月日轉(zhuǎn)換為星期
printDateTime(WEEK_TIME, parse);
} else {
// 如果向前超出了一周輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
}
}
} else {
// 當(dāng)前天向前超出了一周輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
}
} else {
// 不同月,輸出月日時(shí)分
printDateTime(MONTH_DAY_TIME, parse);
}
} else {
// 不同年,輸出年月日時(shí)分
printDateTime(YEAR_MONTH_DAY_TIME, parse);
}
}
/**
* 格式化結(jié)果
*
* @param pattern 模式字符串
* @param datetime 時(shí)間
*/
private static void printDateTime(String pattern, LocalDateTime datetime) {
// 通過模式字符串對時(shí)間進(jìn)行格式化
DateTimeFormatter ofPattern = DateTimeFormatter.ofPattern(pattern);
// 打印格式化后的時(shí)間
System.out.println("格式化結(jié)果:\n\t" + ofPattern.format(datetime));
}
}
代碼測試結(jié)果:
請輸入日期時(shí)間:
常用格式: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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 定時(shí)器(Timer)及線程池里使用定時(shí)器實(shí)例代碼
這篇文章主要介紹了Java 定時(shí)器(Timer)及線程池里使用定時(shí)器實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12
java的arraylist排序示例(arraylist用法)
這篇文章主要介紹了java的arraylist排序示例,學(xué)習(xí)一下arraylist的用法,需要的朋友可以參考下2014-03-03
Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析
這篇文章主要為大家介紹了Netty啟動(dòng)流程服務(wù)端channel初始化源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
Java之Error與Exception的區(qū)別案例詳解
這篇文章主要介紹了Java之Error與Exception的區(qū)別案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-09-09
J2EE驗(yàn)證碼圖片如何生成和點(diǎn)擊刷新驗(yàn)證碼
這篇文章主要介紹了J2EE如何生成驗(yàn)證碼圖片如何生成,如何點(diǎn)擊刷新驗(yàn)證碼的相關(guān)方法,感興趣的小伙伴們可以參考一下2016-04-04
javaSystem.out.println()輸出byte[]、char[]異常的問題詳析
這篇文章主要給大家介紹了關(guān)于javaSystem.out.println()輸出byte[]、char[]異常問題的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看啊2019-01-01

