最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用DateTimeFormatter格式化輸入的日期時間

 更新時間:2020年01月13日 09:15:24   作者:wcf_hrkj  
這篇文章主要介紹了Java使用DateTimeFormatter格式化輸入的日期時間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

要求:

用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.考慮特殊情況下的日期:

比如當(dāng)前天是1號
則上個月的最后一天是昨天
往前推一周則顯式:星期幾 02:02
如果當(dāng)前天不大于7號
則向前推一周到了上個月
也要考慮將其轉(zhuǎn)換為星期

4.先輸入一個時間,再對這個時間使用DateTimeFormatter進(jìn)行格式化

比如:
輸入: 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();
 }
}

日期時間等需要用到的正則表達(dá)式:

package hrkj.chapter7.dateTimeFormatter.Test1;

/**
 * 日期時間的正則表達(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])))"),
 /**
 * 匹配時間
 */
 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;
 }

}

輸入日期時間進(jìn)行處理:

package hrkj.chapter7.dateTimeFormatter.Test1;

import java.util.Scanner;

/**
 * 輸入日期時間進(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();
 /**
 * 時間正則
 */
 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();
  // 對輸入的字符進(jìn)行判斷
  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)) {
  // 對輸入的日期時間字符串進(jìn)行格式化
  DateTimeFormatterTools.format(str);
  // 格式化后提示
  Hint.CONTINUE_OR_QUIT.println();
  } else {
  // 輸入的日期時間不正確
  Hint.INVOKE_DATE_TIME.println();
  // 輸入提示
  Hint.INPUT_DATE_TIME.println();
  continue;
  }
 }
 }
}

對輸入的日期時間進(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;

/**
 * 對輸入的日期時間進(jìn)行處理 <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();
 /**
 * 當(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)造器,無法實例化
 }

 /**
 * 處理輸入的日期時間
 * 
 * @param str 輸入的日期時間
 */
 public static void format(String str) {
 // 將日期和時間用空格進(jìn)行分割
 String[] datetime = str.split(" ");
 // 分割成的日期
 String date = datetime[0];
 // 分割成的時間
 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);
 // 使用:對時間進(jìn)行分割,時間只能用:進(jìn)行分割
 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]);
 // 對拆解判斷過的字符串進(jìn)行重新組合
 String str1 = year + splitter + month + splitter + day + " " + hour + ":" + minute;
 // 對組合后的字符串進(jìn)行解析
 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,則判斷當(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,這輸出月日時分
   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,則輸入月日時分,小于7則從當(dāng)前天往前一周轉(zhuǎn)換為星期
  if (currentDay >= 7) {
   // 輸出月日時分
   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 {
    // 如果向前超出了一周輸出月日時分
    printDateTime(MONTH_DAY_TIME, parse);
   }
   } else {
   if (28 - day + currentDay < 7) {
    // 年月日轉(zhuǎn)換為星期
    printDateTime(WEEK_TIME, parse);
   } else {
    // 如果向前超出了一周輸出月日時分
    printDateTime(MONTH_DAY_TIME, parse);
   }
   }
  } else {
   // 當(dāng)前天向前超出了一周輸出月日時分
   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) {
 // 通過模式字符串對時間進(jìn)行格式化
 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í)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java實現(xiàn)一個簡易版的多級菜單功能

    Java實現(xiàn)一個簡易版的多級菜單功能

    這篇文章主要給大家介紹了關(guān)于Java如何實現(xiàn)一個簡易版的多級菜單功能的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2022-01-01
  • 詳解java中動態(tài)代理實現(xiàn)機制

    詳解java中動態(tài)代理實現(xiàn)機制

    這篇文章主要為大家介紹了java中動態(tài)代理實現(xiàn)機制的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    ArrayList源碼探秘之Java動態(tài)數(shù)組的實現(xiàn)

    這篇文章將帶大家從ArrayList源碼來探秘一下Java動態(tài)數(shù)組的實現(xiàn),文中的示例代碼講解詳細(xì),對我們深入了解JavaScript有一定的幫助,需要的可以參考一下
    2023-08-08
  • SpringBoot 集成 ShedLock 分布式鎖的示例詳解

    SpringBoot 集成 ShedLock 分布式鎖的示例詳解

    ShedLock是一個在分布式環(huán)境中使用的定時任務(wù)框架,用于解決在分布式環(huán)境中的多個實例的相同定時任務(wù)在同一時間點重復(fù)執(zhí)行的問題,本文重點給大家介紹SpringBoot 分布式鎖ShedLock的相關(guān)知識,感興趣的朋友一起看看吧
    2021-08-08
  • SpringSecurity請求授權(quán)規(guī)則配置與注解詳解

    SpringSecurity請求授權(quán)規(guī)則配置與注解詳解

    這篇文章主要介紹了SpringSecurity請求授權(quán)規(guī)則配置與注解詳解,我們常使用@Secured與@PreAuthorize兩個注解在進(jìn)入方法前進(jìn)行角色、權(quán)限的控制,進(jìn)入方法前數(shù)據(jù)的過濾@PreFilter注解偶爾會看到,需要的朋友可以參考下
    2023-12-12
  • Spring?注入靜態(tài)對象使用三種方式示例

    Spring?注入靜態(tài)對象使用三種方式示例

    這篇文章主要為大家介紹了Spring注入靜態(tài)對象使用的三種方式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群的方案

    Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群的方案

    Kubernetes是一個開源的容器編排平臺,可以自動化在部署、管理和擴(kuò)展容器化應(yīng)用過程中涉及的許多手動操作,這篇文章主要介紹了Spring Boot集成kubernetes客戶端實現(xiàn)API操作k8s集群,需要的朋友可以參考下
    2024-08-08
  • java實現(xiàn)簡單的汽車租賃系統(tǒng)

    java實現(xiàn)簡單的汽車租賃系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單的汽車租賃系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • JAVA JDK8 List獲取屬性列表

    JAVA JDK8 List獲取屬性列表

    今天小編就為大家分享一篇關(guān)于JAVA JDK8 List獲取屬性列表,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Java入門基礎(chǔ)之常規(guī)的命名方法和變量的值及其引用

    Java入門基礎(chǔ)之常規(guī)的命名方法和變量的值及其引用

    這篇文章主要介紹了Java的命名方法和變量的值及其引用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-09-09

最新評論

绩溪县| 阆中市| 监利县| 浦东新区| 延川县| 长沙市| 伊宁县| 嫩江县| 韶山市| 城口县| 乐至县| 海门市| 勃利县| 海安县| 革吉县| 林芝县| 宁国市| 邵阳县| 渑池县| 葫芦岛市| 丰县| 克山县| 石楼县| 九龙城区| 乡城县| 大庆市| 扶余县| 广南县| 遂川县| 钟山县| 宁蒗| 桂阳县| 阳高县| 沾化县| 黑山县| 余江县| 河西区| 辽中县| 海口市| 区。| 闵行区|