Java

使用compareTo運算子,達成各種日期檢核的奇怪需求 | Java


今天的 Spring Card 要完成SA文件,例外處理檢核邏輯的開發,其中有個需求蠻有趣的:「若不符合 XX日減一年 ≦ XX日 ≦ XX日加一個月,出現錯誤訊息:「(錯誤代號)-已超過XX日可輸入範圍」」

這讓我苦惱了很久,大約兩三個小時去了~

最後我想到個很土炮的方法,反正字串傳進來是yyyyMMdd,那我就轉成數字,也就是"20230819" -> 20230819 然後減10000 就會變成20220819 若加100月份就會是9月

  • 20230819 - 10000 = 20220819
  • 20230819 + 100 = 20230919

完美

好啦~今天可以準時下班啦 YA

if((Integer.parseInt(date) - 10000 <= Integer.parseInt(date) || Integer.parseInt(date) <= Integer.parseInt(date) + 100)){
    /** 內容已被和諧 **/
    throw Exception;
}

厲害吧!我根本是個天才


熱騰騰端去給學長看,想當然而先被釘在天花板上啦qaq

「你這種作法在極端情況下,會出問題的。」


學長,人家錯惹,再也不敢了嗚嗚嗚嗚嗚

image


想一想是沒錯啦!不然12月變成13月也是蠻恐怖的XDDDD
所以調整作法,使用LocalDate這個物件,來達成SA文件上的需求
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMdd")
    
LocalDate date = LocalDate.parse(getDate(), dtf);

LocalDate localDate = LocalDate.now(ZoneId.of("Asia/Taipei")); //未來寫個Methods 依據國別判斷導入之時區

LocalDate plusMonths = localDate.plusMonths(1);
LocalDate minusYears = localDate.minusYears(1);
if(minusYears.compareTo(date) >= 0 || plusMonths.compareTo(date) <= 0){
    /** 內容已被和諧 **/
    throw Exception;
    }
}
  1. 我先用把字串的20230819轉型為LocalDate
  2. 宣告個變數localDate取得指定時區的現在時間
  3. 依SA文件需求,宣告plusMonths與minusYears變數,並使用plusMonths(), minusYears()這兩個Methods
  4. 最後再善用 compareTo 比較 -1 0 1之間的運算子,如:>, <, =, >=, <=, !=,來達成檢核邏輯的判斷
  1. 請把設計好的錯誤代號與訊息,狠狠地砸到前端廠商身上:)

image


compareTo Example

public static void main(String[] args) {
      // 建立兩個日期
      Date date = new Date(108, 6, 11);
      Date date1 = new Date(109, 3, 19);

      // 宣告三個比較時間的變數
      
      //時間小compareTo時間大
      int num1 = date.compareTo(date1);

      //時間大compareTo時間小
      int num2 = date1.compareTo(date);

      //同個時間compareTo同個時間
      int num3 = date.compareTo(date);

      // 列印結果
      System.out.println("Num is:" + num1);
      System.out.println("Num is:" + num2);
      System.out.println("Num is:" + num3);

   }
}

列印結果
Num is:-1
Num is:1
Num is:0

好啦以後就能用compareTo去玩一堆檢核邏輯的花招啦~今天就分享到這,謝謝觀看