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

Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間

 更新時(shí)間:2020年01月12日 16:37:55   作者:ZLC_hrkj  
這篇文章主要介紹了Java使用DateTimeFormatter實(shí)現(xiàn)格式化時(shí)間,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

用掃描器獲取輸入的時(shí)間(年月日時(shí)分),這個(gè)時(shí)間的格式是常用的格式,然后格式化這個(gè)時(shí)間,把格式化的時(shí)間輸出到控制臺(tái),可以在控制臺(tái)重復(fù)輸入時(shí)間.格式化的時(shí)間參考企業(yè)微信聊天記錄的展示時(shí)間.用DateTimeFormatter實(shí)現(xiàn),功能如下:
同年:
不同年:
同月:月日+上午/下午+時(shí)分
同年不同月:月日+時(shí)分
今天:上午/下午+時(shí)分
明天:明天+上午/下午+時(shí)分
昨天:昨天+上午/下午+時(shí)分
包括今天在內(nèi)的一周內(nèi):星期+上午/下午+時(shí)分

首先看一下測(cè)試類(lèi):

package hrkj;

import java.util.Scanner;

/**
 * 日期時(shí)間測(cè)試類(lèi)
 * 
 * @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);
 // 程序開(kāi)始提示語(yǔ)句
 Hint.HINT_STAR.print();
 // 程序退出提示語(yǔ)句
 System.out.println(Order.ORDER_EXIT.getname());
 while (sc.hasNextLine()) {
  String str = sc.nextLine();
  // 判斷是否為退出指令
  if (Order.ORDER_EXIT.compare(str)) {
  Hint.HINT_END.print();
  //如果退出,則關(guān)閉掃描器
  sc.close();
  break;
  // 判斷輸入的是否為空格或回車(chē)
  } else if (str.equals(" ") || str.equals(""
   + "")) {
  Hint.BLANK_OR_ENTER.print();
  } else {
  // 開(kāi)始處理日期時(shí)間
  DateTimeTool.dateTimeFormatter(str);
  }
  Hint.HINT_STAR.print();
  System.out.println(Order.ORDER_EXIT.getname());
 }
 }

}

這里比較好的一點(diǎn)就是,在程序結(jié)束之前,會(huì)關(guān)閉掃描器,程序開(kāi)始和程序結(jié)束,都會(huì)有提示語(yǔ)句:

請(qǐng)輸入正確的時(shí)間,例如:
2020-01-10 10:10   2020.01.10 10:10   2020/01/10 10:10
退出請(qǐng)輸入:[exit, 退出]

上面效果分別對(duì)應(yīng)以下兩行代碼:

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

其中[exit, 退出]單獨(dú)為第二行代碼,與第一行代碼效果拼接在一起,值得注意的是,Hint是一個(gè)枚舉類(lèi),程序開(kāi)始;運(yùn)行期間和結(jié)尾的提示語(yǔ)句,都定義為枚舉值,具體如下:

package hrkj;

/**
 * 日期時(shí)間類(lèi)的提示語(yǔ)句,用于提示錯(cuò)誤信息
 * 
 * @author 張林琛<br>
 * @date 2020/01/10 08:39:27
 * @version 1.0
 */

public enum Hint {
 /**
 * 日期時(shí)間長(zhǎng)度不合法
 */
 LENGTH_ILLEGAL("日期時(shí)間長(zhǎng)度不合法,"),
 /**
 * 日期錯(cuò)誤
 */
 HINT_DATE("日期輸入錯(cuò)誤,"),
 /**
 * 月份輸入不合法
 */
 HINT_MONTH("月份輸入不合法,"),
 /**
 * 大月只有31天
 */
 HINT_BIGMONTH("大月只有31天,"),
 /**
 * 小月只有30天
 */
 HINT_TINYMONTH("小月只有30天,"),
 /**
 * 平年2月只有28天
 */
 HINT_TINY_TWOMONTH("平年二月只有28天,"),
 /**
 * 閏年二月只有29天
 */
 HINT_BIG_TWOMONTH("閏年二月只有28天,"),
 /**
 * 時(shí)間錯(cuò)誤
 */
 HINT_TIME("時(shí)間輸入錯(cuò)誤,"),
 /**
 * 輸入空格或回車(chē)
 */
 BLANK_OR_ENTER("不能輸入空格或直接回車(chē),"),
 /**
 * 以空格分開(kāi)日期和時(shí)間
 */
 DATE_BLANK_TIME("請(qǐng)以空格分割開(kāi)日期和時(shí)間,"),
 /**
 * 開(kāi)始提示語(yǔ)句
 */
 HINT_STAR("請(qǐng)輸入正確的時(shí)間,例如:\n2020-01-10 10:10  2020.01.10 10:10  2020/01/10 10:10\n退出請(qǐng)輸入:"),
 /**
 * 程序結(jié)束提示語(yǔ)句
 */
 HINT_END("程序結(jié)束,歡迎下次使用!");
 // 定義實(shí)例變量
 private final String name;

 /**
 * 單個(gè)參數(shù)構(gòu)造器
 * 
 * @param name
 */
 private Hint(String name) {
 this.name = name;

 }

 /**
 * 獲取實(shí)例變量的值
 * 
 * @return name
 */
 public String getName() {
 return name;
 }

 /**
 * 打印提示語(yǔ)句的方法
 */
 public void print() {
 System.out.print(name);
 }
}

因?yàn)槊杜e類(lèi)中定義了一個(gè)print()方法,調(diào)用此方法可直接打印枚舉值.
上面說(shuō)到,[exit, 退出]為退出指令,用戶輸入exit或退出則會(huì)關(guān)閉掃描器,接著關(guān)閉程序,在此也把退出定義為一個(gè)指令枚舉類(lèi),具體實(shí)現(xiàn)如下:

package hrkj;

import java.util.Arrays;

/**
 * 日期時(shí)間類(lèi)的指令集,用于輸入相對(duì)應(yīng)的指令
 * 
 * @author 張林琛<br>
 * @date 2020/01/10 08:38:05
 * @version 1.0
 */
public enum Order {
 /**
 * 退出指令
 */
 ORDER_EXIT("exit","退出");
 // 定義實(shí)例變量數(shù)組name
 private final String[] name;

 /**
 * 形參可變的構(gòu)造器
 * @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枚舉類(lèi)雖然枚舉實(shí)例只有一個(gè)退出(如果有其他指令可繼續(xù)添加),但枚舉值為兩個(gè):退出和exit,用戶輸入任意一個(gè)就會(huì)達(dá)到退出的效果,在此類(lèi)中定義一個(gè)比較方法,用于比較用戶輸入的是否與枚舉值相同,用到equals()方法,之所以沒(méi)有用contains()方法,是因?yàn)橐坏┯胏ontains()方法,那么用戶輸入e,x,it,等,只要是在枚舉值包含的,都可以退出.

最后便是工具類(lèi),用于格式化日期時(shí)間并輸出,實(shí)現(xiàn)細(xì)節(jié)如下

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;

/**
 * 日期時(shí)間實(shí)現(xiàn)類(lèi),使用DateTimeFormatter實(shí)現(xiàn)
 * 
 * @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 };

 /**
 * 處理日期和時(shí)間
 * 
 * @param str
 */
 public static void dateTimeFormatter(String str) {
 // 判斷日期時(shí)間的長(zhǎng)度
 if (str.length() < 9 || str.length() > 16) {
  Hint.LENGTH_ILLEGAL.print();
  return;
 }
 // 判斷輸入的日期和時(shí)間是否以空格分割
 if (str.contains(" ")) {
  // 創(chuàng)建數(shù)組來(lái)接收分割后的日期時(shí)間
  String[] datetime = str.split(" ");
  // 獲取日期
  String[] date = splitDate(datetime[0]);
  // 判斷日期長(zhǎng)度
  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;
   // 如果大月天數(shù)超過(guò)31或小于1
  } else if (Arrays.binarySearch(bigMonth, M) > -1 && (d <= 0 || d > 31)) {
   Hint.HINT_BIGMONTH.print();
   return;
   // 如果小月天數(shù)超過(guò)30或小于1
  } else if (Arrays.binarySearch(tinyMonth, M) > -1 && (d <= 0 || d > 30)) {
   Hint.HINT_TINYMONTH.print();
   return;
   // 如果平年二月天數(shù)超過(guò)28或小于1
  } else if (y % 4 != 0 && y % 100 != 0 && M == 2 && (d <= 0 || d > 28)) {
   Hint.HINT_TINY_TWOMONTH.print();
   return;
   // 如果平年二月天數(shù)超過(guò)28或小于1
  } else if (y % 400 != 0 && M == 2 && (d <= 0 || d > 28)) {
   Hint.HINT_TINY_TWOMONTH.print();
   return;
   // 如果閏年二月天數(shù)超過(guò)29或小于1
  } else if (y % 4 == 0 && y % 100 != 0 && M == 2 && (d <= 0 || d > 29)) {
   Hint.HINT_BIG_TWOMONTH.print();
   return;
   // 如果閏年二月天數(shù)超過(guò)29或小于1
  } else if (y % 400 == 0 && M == 2 && (d <= 0 || d > 29)) {
   Hint.HINT_BIG_TWOMONTH.print();
   return;
  } else {
   return;
  }

  }
  // 獲取時(shí)間
  String time = datetime[1];
  // 判斷是否以正則分割
  boolean b = spiltTime(time);
  // 如果沒(méi)有以正則分割
  if (!b) {
  Hint.HINT_TIME.print();
  return;
  } else {
  // 進(jìn)行日期和時(shí)間的拼接
  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);
  // 判斷是不是當(dāng)年
  if (y == Year.now().getValue()) {
   // 判斷是不是當(dāng)月
   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);
    // 判斷一周內(nèi)的哪一天
   } else if (d - MonthDay.now().getDayOfMonth() >= -7
    && d - MonthDay.now().getDayOfMonth() <= -2) {
    printMessage("E a H:m", parse1);
    // 在當(dāng)月內(nèi),但不在本周
   } else {
         printMessage("M-d a H:m", parse1);
   }
   // 當(dāng)前年的其他月
   } else {
   printMessage("M-d H:m", parse1);
   }
   // 不同年的情況下
  } else {
  DateTimeFormatter dtf = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.LONG, FormatStyle.SHORT);
   System.out.println(parse1.format(dtf) + "分");
  }

  }
 } else {
  return;
 }

 }

 /**
 * 獲取時(shí)間格式器并解析,打印時(shí)間
 * 
 * @param info     模式字符串
 * @param localDateTime LocalDateTime對(duì)象
 */
 private static void printMessage(String info, LocalDateTime localDateTime) {
 //把模式字符串傳進(jìn)去,獲取到DateTimeFormatter對(duì)象
 DateTimeFormatter ofPattern2 = DateTimeFormatter.ofPattern(info);
 //用LocalDateTime對(duì)象解析獲取到的DateTimeFormatter對(duì)象
 System.out.println(localDateTime.format(ofPattern2));
 }

 /**
 * 判斷大小閏年方法
 * 其中判斷了平年和閏年內(nèi)大月和小月的天數(shù)
 * @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;
 }

 /**
 * 使用正則表達(dá)式限定時(shí)間
 * 
 * @param time 需要分割的時(shí)間
 * @return 分割后的結(jié)果
 */
 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;
 }

 /**
 * 使用正則表達(dá)式限定日期
 * 
 * @param date 需要分割的日期
 * @return 分割后的日期
 */
 private static String[] splitDate(String date) {
 // 分割年月日
 String r = "[\\./-]{1}";
 // 月份出現(xiàn)的位數(shù)
 String s = "\\d{1,2}";
 return date.matches("\\d+" + "(" + r + s + "){2}") ? date.split(r) : new String[0];
 }

}

在實(shí)現(xiàn)類(lèi)中,使用了正則表達(dá)式(一個(gè)強(qiáng)大的字符串處理工具)來(lái)限定日期和時(shí)間的分隔符(. / - : 四種),輸入類(lèi)型(只能為數(shù)字)等,得到自己想要的日期時(shí)間格式,然后對(duì)平閏年進(jìn)行判斷,完成后再拼接時(shí)間.然后把獲取時(shí)間格式器和解析抽象成一個(gè)方法(因?yàn)橛玫暮芏?如果不抽象成方法,會(huì)顯得代碼很冗長(zhǎng)),每次使用直接調(diào)用方法.最后在不同年的情況下,使用了不同風(fēng)格的時(shí)間格式化器完成格式化.

測(cè)試雖然沒(méi)有任何Bug,但跨年(比如19年的12月31號(hào)是20年的1月1號(hào)的昨天),跨月(比如20年1月31號(hào)為星期五,2月2號(hào)為星期日)沒(méi)有實(shí)現(xiàn),如需其他需要,請(qǐng)自行添加邏輯實(shí)現(xiàn).

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring Boot與Kotlin處理Web表單提交的方法

    Spring Boot與Kotlin處理Web表單提交的方法

    本篇文章主要介紹了Spring Boot 與 Kotlin 處理Web表單提交的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Spring Data Jpa的四種查詢(xún)方式詳解

    Spring Data Jpa的四種查詢(xún)方式詳解

    這篇文章主要介紹了Spring Data Jpa的四種查詢(xún)方式詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(48)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(48)

    下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你
    2021-08-08
  • 全局記錄Feign的請(qǐng)求和響應(yīng)日志方式

    全局記錄Feign的請(qǐng)求和響應(yīng)日志方式

    這篇文章主要介紹了全局記錄Feign的請(qǐng)求和響應(yīng)日志方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中JavaBean對(duì)象和Map的互相轉(zhuǎn)換方法實(shí)例

    Java中JavaBean對(duì)象和Map的互相轉(zhuǎn)換方法實(shí)例

    為什么需要將javaBean和map進(jìn)行轉(zhuǎn)換,在很多應(yīng)用場(chǎng)景中,需要將key=value形式的數(shù)據(jù)與javaBean對(duì)象相互轉(zhuǎn)換,下面這篇文章主要給大家介紹了關(guān)于Java中JavaBean對(duì)象和Map的互相轉(zhuǎn)換的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法

    Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法

    這篇文章給大家主要介紹了Mybatis-Plus可能導(dǎo)致死鎖的問(wèn)題分析及解決辦法,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-12-12
  • java實(shí)現(xiàn)仿射密碼加密解密

    java實(shí)現(xiàn)仿射密碼加密解密

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)仿射密碼加密解密的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-03-03
  • mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見(jiàn)的使用方法總結(jié)

    mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見(jiàn)的使用方法總結(jié)

    mybatis-plus是在mybatis的基礎(chǔ)上做增強(qiáng)不做改變,簡(jiǎn)化了CRUD操作,下面這篇文章主要給大家介紹了關(guān)于mybatis-plus中l(wèi)ambdaQuery()與lambdaUpdate()比較常見(jiàn)的使用方法,需要的朋友可以參考下
    2022-09-09
  • 詳解Java構(gòu)建樹(shù)結(jié)構(gòu)的公共方法

    詳解Java構(gòu)建樹(shù)結(jié)構(gòu)的公共方法

    本文主要介紹了詳解Java構(gòu)建樹(shù)結(jié)構(gòu)的公共方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案

    Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Mybatis collection查詢(xún)集合屬性報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評(píng)論

普定县| 南靖县| 都昌县| 沙河市| 玉林市| 莱芜市| 祥云县| 灌云县| 长子县| 甘德县| 永新县| 鄂托克前旗| 贡嘎县| 丘北县| 丰台区| 云浮市| 南部县| 绥滨县| 都江堰市| 遂溪县| 利川市| 汉寿县| 盘锦市| 祁门县| 察雅县| 南城县| 永德县| 锡林郭勒盟| 京山县| 雷山县| 岫岩| 西乌珠穆沁旗| 高阳县| 盐城市| 禹城市| 澎湖县| 娄底市| 汉源县| 久治县| 汾西县| 闸北区|