亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中怎么利用DateTimeFormatter格式化時間

發布時間:2021-08-07 14:04:35 來源:億速云 閱讀:177 作者:Leah 欄目:編程語言

這篇文章給大家介紹Java中怎么利用DateTimeFormatter格式化時間,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

首先看一下測試類:

package hrkj;import java.util.Scanner;/** * 日期時間測試類 *  * @author 張林琛<br> * @date 2020/01/10 08:35:29 * @version 1.0 */public class DateTimeTest { public static void main(String[] args) { // 獲取Scanner掃描器 Scanner sc = new Scanner(System.in); // 程序開始提示語句 Hint.HINT_STAR.print(); // 程序退出提示語句 System.out.println(Order.ORDER_EXIT.getname()); while (sc.hasNextLine()) {  String str = sc.nextLine();  // 判斷是否為退出指令  if (Order.ORDER_EXIT.compare(str)) {  Hint.HINT_END.print();  //如果退出,則關閉掃描器  sc.close();  break;  // 判斷輸入的是否為空格或回車  } else if (str.equals(" ") || str.equals(""   + "")) {  Hint.BLANK_OR_ENTER.print();  } else {  // 開始處理日期時間  DateTimeTool.dateTimeFormatter(str);  }  Hint.HINT_STAR.print();  System.out.println(Order.ORDER_EXIT.getname()); } }}

這里比較好的一點就是,在程序結束之前,會關閉掃描器,程序開始和程序結束,都會有提示語句:

請輸入正確的時間,例如:2020-01-10 10:10 2020.01.10 10:10 2020/01/10 10:10退出請輸入:[exit, 退出]

上面效果分別對應以下兩行代碼:

// 程序開始提示語句 Hint.HINT_STAR.print(); // 程序退出提示語句 System.out.println(Order.ORDER_EXIT.getname());

其中[exit, 退出]單獨為第二行代碼,與第一行代碼效果拼接在一起,值得注意的是,Hint是一個枚舉類,程序開始;運行期間和結尾的提示語句,都定義為枚舉值,具體如下:

package hrkj;/** * 日期時間類的提示語句,用于提示錯誤信息 *  * @author 張林琛<br> * @date 2020/01/10 08:39:27 * @version 1.0 */public enum Hint { /** * 日期時間長度不合法 */ LENGTH_ILLEGAL("日期時間長度不合法,"), /** * 日期錯誤 */ HINT_DATE("日期輸入錯誤,"), /** * 月份輸入不合法 */ HINT_MONTH("月份輸入不合法,"), /** * 大月只有31天 */ HINT_BIGMONTH("大月只有31天,"), /** * 小月只有30天 */ HINT_TINYMONTH("小月只有30天,"), /** * 平年2月只有28天 */ HINT_TINY_TWOMONTH("平年二月只有28天,"), /** * 閏年二月只有29天 */ HINT_BIG_TWOMONTH("閏年二月只有28天,"), /** * 時間錯誤 */ HINT_TIME("時間輸入錯誤,"), /** * 輸入空格或回車 */ BLANK_OR_ENTER("不能輸入空格或直接回車,"), /** * 以空格分開日期和時間 */ DATE_BLANK_TIME("請以空格分割開日期和時間,"), /** * 開始提示語句 */ HINT_STAR("請輸入正確的時間,例如:\n2020-01-10 10:10  2020.01.10 10:10  2020/01/10 10:10\n退出請輸入:"), /** * 程序結束提示語句 */ HINT_END("程序結束,歡迎下次使用!"); // 定義實例變量 private final String name; /** * 單個參數構造器 *  * @param name */ private Hint(String name) { this.name = name; } /** * 獲取實例變量的值 *  * @return name */ public String getName() { return name; } /** * 打印提示語句的方法 */ public void print() { System.out.print(name); }}

因為枚舉類中定義了一個print()方法,調用此方法可直接打印枚舉值.上面說到,[exit, 退出]為退出指令,用戶輸入exit或退出則會關閉掃描器,接著關閉程序,在此也把退出定義為一個指令枚舉類,具體實現如下:

package hrkj;import java.util.Arrays;/** * 日期時間類的指令集,用于輸入相對應的指令 *  * @author 張林琛<br> * @date 2020/01/10 08:38:05 * @version 1.0 */public enum Order { /** * 退出指令 */ ORDER_EXIT("exit","退出"); // 定義實例變量數組name private final String[] name; /** * 形參可變的構造器 * @param name */ private Order(String... name) { this.name = name; } /** * 獲取退出的指令 * @return 獲取的指令 */ public String getname() { return Arrays.toString(name); } /** * 判斷輸入的是不是退出的指令 * @param str 輸入的指令 * @return 是否是退出指令 */ public boolean compare(String str) { for (int i = 0; i < name.length; i++) {  if (str.equals(name[i])) {  return true;  } } return false; }}

Order枚舉類雖然枚舉實例只有一個退出(如果有其他指令可繼續添加),但枚舉值為兩個:退出和exit,用戶輸入任意一個就會達到退出的效果,在此類中定義一個比較方法,用于比較用戶輸入的是否與枚舉值相同,用到equals()方法,之所以沒有用contains()方法,是因為一旦用contains()方法,那么用戶輸入e,x,it,等,只要是在枚舉值包含的,都可以退出.

最后便是工具類,用于格式化日期時間并輸出,實現細節如下

package hrkj;import java.time.LocalDateTime;import java.time.MonthDay;import java.time.Year;import java.time.format.DateTimeFormatter;import java.time.format.FormatStyle;import java.util.Arrays;/** * 日期時間實現類,使用DateTimeFormatter實現 *  * @author 張林琛<br> * @date 2020/01/10 08:36:37 * @version 1.0 */public class DateTimeTool { /** * 有31天的月份 */ static int[] bigMonth = { 1, 3, 5, 7, 8, 10, 12 }; /** * 有30天的月份 */ static int[] tinyMonth = { 4, 6, 9, 11 }; /** * 處理日期和時間 *  * @param str */ public static void dateTimeFormatter(String str) { // 判斷日期時間的長度 if (str.length() < 9 || str.length() > 16) {  Hint.LENGTH_ILLEGAL.print();  return; } // 判斷輸入的日期和時間是否以空格分割 if (str.contains(" ")) {  // 創建數組來接收分割后的日期時間  String[] datetime = str.split(" ");  // 獲取日期  String[] date = splitDate(datetime[0]);  // 判斷日期長度  if (date.length != 3) {  Hint.HINT_DATE.print();  return;  }  // 獲取年  Integer y = Integer.valueOf(date[0]);  // 獲取月  Integer M = Integer.valueOf(date[1]);  // 獲取日  Integer d = Integer.valueOf(date[2]);  // 判斷是不是閏年  if (!handleDate(y, M, d)) {  // 如果月份大于12或小于1  if (M > 12 || M < 1) {   Hint.HINT_MONTH.print();   return;   // 如果大月天數超過31或小于1  } else if (Arrays.binarySearch(bigMonth, M) > -1 && (d <= 0 || d > 31)) {   Hint.HINT_BIGMONTH.print();   return;   // 如果小月天數超過30或小于1  } else if (Arrays.binarySearch(tinyMonth, M) > -1 && (d <= 0 || d > 30)) {   Hint.HINT_TINYMONTH.print();   return;   // 如果平年二月天數超過28或小于1  } else if (y % 4 != 0 && y % 100 != 0 && M == 2 && (d <= 0 || d > 28)) {   Hint.HINT_TINY_TWOMONTH.print();   return;   // 如果平年二月天數超過28或小于1  } else if (y % 400 != 0 && M == 2 && (d <= 0 || d > 28)) {   Hint.HINT_TINY_TWOMONTH.print();   return;   // 如果閏年二月天數超過29或小于1  } else if (y % 4 == 0 && y % 100 != 0 && M == 2 && (d <= 0 || d > 29)) {   Hint.HINT_BIG_TWOMONTH.print();   return;   // 如果閏年二月天數超過29或小于1  } else if (y % 400 == 0 && M == 2 && (d <= 0 || d > 29)) {   Hint.HINT_BIG_TWOMONTH.print();   return;  } else {   return;  }  }  // 獲取時間  String time = datetime[1];  // 判斷是否以正則分割  boolean b = spiltTime(time);  // 如果沒有以正則分割  if (!b) {  Hint.HINT_TIME.print();  return;  } else {  // 進行日期和時間的拼接  String dateTime = y + "-" + M + "-" + d + " " + time;  DateTimeFormatter ofPattern1 = DateTimeFormatter.ofPattern("y-M-d H:m");  LocalDateTime parse1 = LocalDateTime.parse(dateTime, ofPattern1);  // System.out.println(parse1);  // 判斷是不是當年  if (y == Year.now().getValue()) {   // 判斷是不是當月   if (M == MonthDay.now().getMonthValue()) {   // 判斷是不是今天   if (d == MonthDay.now().getDayOfMonth()) {    printMessage("今天 a H:m", parse1);    // 判斷是不是昨天   } else if (d - MonthDay.now().getDayOfMonth() == -1) {    printMessage("今天 a H:m", parse1);    // 判斷是不是明天   } else if (d - MonthDay.now().getDayOfMonth() == 1) {    printMessage("明天 a H:m", parse1);    // 判斷一周內的哪一天   } else if (d - MonthDay.now().getDayOfMonth() >= -7    && d - MonthDay.now().getDayOfMonth() <= -2) {    printMessage("E a H:m", parse1);    // 在當月內,但不在本周   } else {         printMessage("M-d a H:m", parse1);   }   // 當前年的其他月   } else {   printMessage("M-d H:m", parse1);   }   // 不同年的情況下  } else {  DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);   System.out.println(parse1.format(dtf) + "分");  }  } } else {  return; } } /** * 獲取時間格式器并解析,打印時間 *  * @param info     模式字符串 * @param localDateTime LocalDateTime對象 */ private static void printMessage(String info, LocalDateTime localDateTime) { //把模式字符串傳進去,獲取到DateTimeFormatter對象 DateTimeFormatter ofPattern2 = DateTimeFormatter.ofPattern(info); //用LocalDateTime對象解析獲取到的DateTimeFormatter對象 System.out.println(localDateTime.format(ofPattern2)); } /** * 判斷大小閏年方法 * 其中判斷了平年和閏年內大月和小月的天數 * @param y 年 * @param m 月 * @param d 日 * @return true為閏年,false為平年 */ private static boolean handleDate(int y, int m, int d) { // 是閏年二月情況下 if (y % 4 == 0 && y % 100 != 0 && m == 2 && (d > 0 && d <= 29)) {  return true;  // 是閏年二月情況下 } else if (y % 400 == 0 && m == 2 && (d > 0 && d <= 29)) {  return true;  // 不是閏年,但是二月情況下 } else if (y % 4 != 0 && y % 400 != 0 && m == 2 && (d > 0 && d <= 28)) {  // 不是閏年,2月28天  return true;  // 不是二月,判斷是否是大月 } else if (Arrays.binarySearch(bigMonth, m) > -1 && (d > 0 && d <= 31)) {  return true;  // 不是二月,判斷是否是小月 } else if (Arrays.binarySearch(tinyMonth, m) > -1 && (d > 0 && d <= 30)) {  return true; } return false; } /** * 使用正則表達式限定時間 *  * @param time 需要分割的時間 * @return 分割后的結果 */ private static boolean spiltTime(String time) { String t = "([01]?[0-9]{1}|[2][0-3]):[0-5]?[0-9]"; return time.matches(t) ? true : false; } /** * 使用正則表達式限定日期 *  * @param date 需要分割的日期 * @return 分割后的日期 */ private static String[] splitDate(String date) { // 分割年月日 String r = "[\\./-]{1}"; // 月份出現的位數 String s = "\\d{1,2}"; return date.matches("\\d+" + "(" + r + s + "){2}") ? date.split(r) : new String[0]; }}

在實現類中,使用了正則表達式(一個強大的字符串處理工具)來限定日期和時間的分隔符(. / - : 四種),輸入類型(只能為數字)等,得到自己想要的日期時間格式,然后對平閏年進行判斷,完成后再拼接時間.然后把獲取時間格式器和解析抽象成一個方法(因為用的很多,如果不抽象成方法,會顯得代碼很冗長),每次使用直接調用方法.最后在不同年的情況下,使用了不同風格的時間格式化器完成格式化.

測試雖然沒有任何Bug,但跨年(比如19年的12月31號是20年的1月1號的昨天),跨月(比如20年1月31號為星期五,2月2號為星期日)沒有實現,如需其他需要,請自行添加邏輯實現.

關于Java中怎么利用DateTimeFormatter格式化時間就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沐川县| 海宁市| 吐鲁番市| 泾川县| 德昌县| 金沙县| 柞水县| 内江市| 义乌市| 库车县| 桐梓县| 平泉县| 江安县| 桑植县| 曲沃县| 万州区| 安平县| 泰宁县| 中西区| 台北市| 延庆县| 张家港市| 常德市| 浦北县| 岳池县| 新龙县| 五指山市| 迁西县| 江达县| 舞阳县| 玛纳斯县| 扎囊县| 苍梧县| 兰西县| 同德县| 永靖县| 梁平县| 垣曲县| 武汉市| 和平区| 静安区|