天天看點

日期工具類處理總結(全)

文章目錄

  • ​​前言​​
  • ​​代碼展示​​

前言

最近項目中用到了一些關于日期類和字元串類的處理,用到一次就得去寫一次,後來想了想這樣不光效率低還浪費時間浪費精力,于是就将常用的一些方法提取成工具類,每個項目都考進去一次,用的時候直接調用即可。

下面我來分享一下我自己整理的一些工具方法:

代碼展示

👉将時間戳轉換成具體的年月日時分秒

在和安卓端互動時,處理時間的時候,一般都是以時間戳的方式進行互相傳輸,但是在PC端的時候,往往直接處理日期類型的資料比較友善,資料庫中也是存的​

​datetime​

​格式的資料,于是我就寫了個将時間戳轉換成具體的時間,代碼如下:

/**
   * 将毫秒轉換成時間
   */
  /**
   * 根據時間戳擷取時間
   */
  public static String getTimeChuo(Long time) {
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    //将時間戳轉換為時間
    Date date = new Date(time);
    return format.format(date);
  }      

🤞輸入:1657335494926

✌輸出:2022-07-09 10:58:14

👉計算兩個日期之間相差的天數

有時候我們有這樣的場景,需要知道一下開始日期和結束日期之間相差多少天,多少小時,多少分等,于是我就寫了個計算兩個日期之間相差的詳細時間,代碼如下:

/**
   * @param stratTime
   * @param endTime
   * @return 計算兩個日期之間相差的天數
   */
  public static Map<String, Object> dateDiff(Long stratTime, Long endTime) {
    Map<String, Object> map = new HashMap<>();
    Long diff = endTime - stratTime;
    Long day = diff / (24 * 60 * 60 * 1000);
    Long hour = (diff / (60 * 60 * 1000) - day * 24);
    Long min = ((diff / (60 * 1000)) - day * 24 * 60 - hour * 60);
    Long sec = (diff / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
    map.put("day", day);
    map.put("hour", hour);
    map.put("min", min);
    map.put("sec", sec);
    return map;
  }      

🤞輸入:1656151439784L,1657335494926L

✌輸出:{sec=15, min=54, hour=16, day=13},是一個​​

​Map​

​結合

👉擷取目前24小時的時間前後時間戳

比如現在是:2022年7月9日11:14:22,有些業務場景下,我們需要擷取目前時間的前後24的時間,也就是昨天的這個時間和明天的這個時間,于是我就寫了個工具方法,代碼如下:

/**
   * 擷取目前24小時的時間前後時間戳
   */
  public static Map<String, Object> getTimeChuo() {
    Map<String, Object> map = new HashMap<>();
    Long nowTime = System.currentTimeMillis();
    Long startTime = nowTime - 24 * 60 * 60 * 1000;
    Long endTime = nowTime + 24 * 60 * 60 * 1000;
    map.put("startTime", startTime);
    map.put("endTime", endTime);
    return map;
  }      

🤞輸入:無需參數

✌輸出:{startTime=1657250129070, endTime=1657422929070},轉化成日期就是:2022年7月8日11:14:22和2022年7月10日11:14:22

👉根據出生日期獲得年齡

系統中的年齡你能直接寫死嗎,倒也可以,但是你明年得手動的再給人家加1歲。。。後年再加一歲。。。。。這不是個完全之策,于是我就寫了個根據出生日期計算年齡的工具方法,代碼如下:

public static int getAge(Date birthDay) throws Exception {
    Calendar cal = Calendar.getInstance();

    if (cal.before(birthDay)) {
      throw new IllegalArgumentException("出生日期小于目前時間,無效的日期!");
    }
    int yearNow = cal.get(Calendar.YEAR);
    int monthNow = cal.get(Calendar.MONTH);
    int dayOfMonthNow = cal.get(Calendar.DAY_OF_MONTH);
    cal.setTime(birthDay);

    int yearBirth = cal.get(Calendar.YEAR);
    int monthBirth = cal.get(Calendar.MONTH);
    int dayOfMonthBirth = cal.get(Calendar.DAY_OF_MONTH);

    int age = yearNow - yearBirth;

    if (monthNow <= monthBirth) {
      if (monthNow == monthBirth) {
        if (dayOfMonthNow < dayOfMonthBirth) age--;
      } else {
        age--;
      }
    }
    return age;
  }      

🤞輸入:​

​new SimpleDateFormat("yyyy-MM-dd").parse("1998-09-08")​

​ ✌輸出:23

👉統計兩個日期之間的所有日期

比如有這樣的場景,給某個人制定了個訓練計劃,這個計劃從7月1日到7月7日,一周的減肥增肌方案。資料庫存的話,隻存了開始時間7月1日和結束時間7月7日。但是有個問題,你說這個人在7月5日有沒有訓練計劃,7月6日有沒有?當然有,于是我就寫了個工具方法,代碼如下:

/**
   * 統計兩個日期之間的所有日期
   */
  public static List<String> getBeginTimeAndEndTime(Date beginTime, Date endTime) {
    List<String> listDate = new ArrayList<>();
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
    try {
      Calendar calendar = Calendar.getInstance();
      calendar.setTime(beginTime);
      while (calendar.getTime().before(endTime) || calendar.getTime().equals(endTime)) {
        listDate.add(dateFormat.format(calendar.getTime()));
        calendar.add(Calendar.DAY_OF_MONTH, 1);
      }
      return listDate;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return listDate;
  }      

🤞輸入:​

​new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-1"),new SimpleDateFormat("yyyy-MM-dd").parse("2022-7-8")​

​​ ✌輸出:

2022-07-01

2022-07-02

2022-07-03

2022-07-04

2022-07-05

2022-07-06

2022-07-07

2022-07-08

👉格式化日期:00:00點開始到23:59

将某個日期格式化成0時0分到23時59分,于是我就寫了個工具方法,代碼如下:

/**
   * 格式化日期:00:00點開始到23:59
   */
  public static List<Date> formatDayDateStratToEnd(String date){
    List<Date> dateList  = new ArrayList<Date>();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Calendar c = Calendar.getInstance();
    try {
      c.setTime(simpleDateFormat.parse(date+" 00:00:00"));
    } catch (ParseException e) {
      e.printStackTrace();
    }
    if(date!=null){
      c.set(Calendar.HOUR_OF_DAY, 0);
      c.set(Calendar.MINUTE, 0);
      c.set(Calendar.SECOND, 0);
      c.set(Calendar.MILLISECOND, 0);
      dateList.add(c.getTime());
      c.set(Calendar.HOUR_OF_DAY, 23);
      c.set(Calendar.MINUTE, 59);
      c.set(Calendar.SECOND, 59);
      c.set(Calendar.MILLISECOND, 0);
      dateList.add(c.getTime());
    }
    return dateList;
  }      

🤞輸入:2022-07-01

✌輸出:

Fri Jul 01 00:00:00 CST 2022

Fri Jul 01 23:59:59 CST 2022

當然這個日期你也可以自己格式化一下,格式化成需要的格式。

👉擷取年月日,并且拼接起來 分隔符

某些情況下,我們的接口有這樣的功能,根據指定的年月日查詢資訊,如果前台沒有傳年月日,那麼我們就擷取目前年與日進行查詢,于是我就寫了個工具方法,代碼如下:

/**
   * 擷取年月日,并且拼接起來  分隔符
   */
  public static String getDateYearAndMonthAndDay(String year,String month,String day,String separator) {
    //分隔符如果是空的話,則是-
    separator = Strings.isBlank(separator) ? "-" : separator;
    //如果年月日不傳的話,擷取目前的年月日
    StringBuilder currDate = new StringBuilder();
    Calendar date = Calendar.getInstance();
    year = Strings.isBlank(year) ? date.get(Calendar.YEAR) + "" : year;
    month = Strings.isBlank(month) ? date.get(Calendar.MONTH) + 1 + "" : month;
    day = Strings.isBlank(day) ? date.get(Calendar.DAY_OF_MONTH) + "" : day;
    int m = Integer.parseInt(month);
    int d = Integer.parseInt(day);
    month = m < 10 ? "0" + m : m + "";
    day = d < 10 ? "0" + d : d + "";
    currDate.append(year).append(separator).append(month).append(separator).append(day);
    return currDate.toString();
  }      

🤞輸入:null,null,null,null

✌輸出:2022-07-09