Java常用的時間工具類DateTimeUtils.java對常用的時間操作方法總結


     話不多少,直接上代碼!時間工具類DateTimeUtils.java 匯總了以前常用的時間操作方法!

     工具類方法列表:

  1. 將 String 轉為 date
  2. 日期字符串格式化輸出
  3. Date類型日期轉字符串格式化輸出
  4. 增加天數后的Date日期
  5. 計算日期{@link Date}增加某天數后的Date類型日期
  6. 減少天數后的日期
  7. 增加月數后的日期
  8. 減少月數后的日期
  9. 減少年數后的日期
  10. 計算月份差
  11. 計算兩個日期的間隔天數/比較日期大小
  12. 計算兩個時間的毫秒間隔
  13. 計算兩個時間的  分鍾差
  14. 判斷是否為交易日/工作日
  15. 判斷是否是周末
  16. 判斷是否為國家法定節假日
  17. 判斷是否為國家調整后的工作日
  18. 獲得時間指定時間差值 日期
  19. 判斷目標時間是否在區間內
  20. 獲取當前8位系統日期
  21. 獲取當前6位系統時間
  22. 獲取當前14位系統日期時間
  23. 按指定格式獲取當前系統日期時間
  24. 獲取字符串start到end天數間隔
  25. 獲取Date日期類型start到end天數間隔

  還有其他操作,逐步補充中 .......

package com....;

import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/** 
 * @version V1.0
 * @File: DateUtils
 * @Description: 常用的時間處理方法集合工具類 
 * @author: aitree 
 */
public class DateUtils {
    /**
     * 時間格式常量
     */
    public static final String COMMON_PATTERN       = "yyyy-MM-dd HH:mm:ss";
    public static final String COMMON_PATTERN_TYPE2 = "yyyy/MM/dd HH:mm:ss";
    public static final String SHORT_PATTERN        = "yyyy-MM-dd";
    public static final String SHORT_PATTERN_TYPE2  = "yyyy/MM/dd";
    public static final String LONG_PATTERN         = "yyyy-MM-dd HH:mm:ss.SSS";
    public static final String SUP_SHORT_PATTERN    = "yyyyMMdd";
    public static final String SUP_LONG_PATTERN     = "yyyyMMddHHmmss";
    public static final String YEAR_MONTH           = "yyyyMM";
    public static final String CN_SHORT_PATTERN     = "yyyy年MM月dd日";
    public static final String DDMM_PATTERN         = "ddMM";

    /**
     * 1、將 String 解析為 date
     *
     * @param dateString 待解析的日期字符串
     * @param pattern    日期字符串的時間格式
     * @return
     */
    public static Date trans2Date(String dateString, String pattern) {
        String fRTN = StringUtils.isNotBlank(pattern) ? pattern : COMMON_PATTERN;
        DateTimeFormatter format = DateTimeFormat.forPattern(fRTN);
        DateTime dt = DateTime.parse(dateString, format);
        return dt.toDate();
    }

    /**
     */2、日期字符串格式化輸出
     *
     * @param dateString  待格式化的日期字符串
     * @param fromPattern 待格式化日期字符串的格式
     * @param toPattern   格式化后的日期格式
     * @return
     */
    public static String formatDate2String(String dateString, String fromPattern, String toPattern) {
        String tRTN = StringUtils.isNotBlank(toPattern) ? toPattern : COMMON_PATTERN;
        DateTimeFormatter format = DateTimeFormat.forPattern(fromPattern);
        DateTime dt = DateTime.parse(dateString, format);
        return dt.toString(tRTN);
    }

    /**
     * 3、Date類型日期轉字符串格式化輸出
     *
     * @param date    待格式化的日期
     * @param pattern 格式化后的格式
     * @return
     */
    public static String formatDate2String(Date date, String pattern) {
        String fRTN = StringUtils.isNotBlank(pattern) ? pattern : COMMON_PATTERN;
        DateTimeFormatter format = DateTimeFormat.forPattern(fRTN);
        return new DateTime(date).toString(format);
    }

    /**
     * 4、增加天數后的Date日期
     *
     * @param date      起點日期(date/string)
     * @param daysCount 增加天數
     * @return
     */
    public static <T> Date add(T date, int daysCount) {
        DateTime dt = new DateTime(date);
        return dt.plusDays(daysCount).toDate();
    }
    /**
     * 5、計算日期{@link Date}增加某天數后的Date類型日期
     *
     * @param d           Date
     * @param amountToAdd 天數增加值
     * @return Date
     */
    public static Date plusDays(Date d, long amountToAdd) {
         return toDate(plusDays(toLocalDateTime(d), amountToAdd));
    }
    public static LocalDateTime plusDays(LocalDateTime ldt, long amountToAdd) {
         return ldt.plusDays(amountToAdd);
    }
    /**
     *6、減少天數后的日期
     *
     * @param date      起點日期(date/string)
     * @param daysCount 減少的天數
     * @return
     */
    public static <T> Date sub(T date, int daysCount) {
        DateTime dt = new DateTime(date);
        return dt.minusDays(daysCount).toDate();
    }

    /**
     * 7、增加月數后的日期
     *
     * @param date      起點日期(date/string)
     * @param months    增加月數
     * @return
     */
    public static <T> Date addMonths(T date, int months) {
        DateTime dt = new DateTime(date);
        return dt.plusMonths(months).toDate();
    }

    /**
     */8、減少月數后的日期
     *
     * @param date      起點日期(date/string)
     * @param months    減少的月數
     * @return
     */
    public static <T> Date subMonths(T date, int months) {
        DateTime dt = new DateTime(date);
        return dt.minusMonths(months).toDate();
    }

    /**
     */9、減少年數后的日期
     *
     * @param date      起點日期(date/string)
     * @param years     減少的年數
     * @return
     */
    public static <T> Date subYears(T date, int years) {
        DateTime dt = new DateTime(date);
        return dt.minusYears(years).toDate();
    }

    /**
     * 10、計算月份差
     * @param lastRepaymentDate
     * @param fundLoanDate
     * @return
     */
    public static int getMonthParse(String lastRepaymentDate, String fundLoanDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
        Calendar bef = Calendar.getInstance();
        Calendar aft = Calendar.getInstance();
        bef.setTime(sdf.parse(fundLoanDate));
        aft.setTime(sdf.parse(lastRepaymentDate));
        int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH);
        int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR))*12;
        return month+result;
    }
    /**
     * 11、計算兩個日期的間隔天數
     * 目前不對兩個日期比較大小,如放錯順序,則結果為負數的天數
     *
     * @param dateMin 起點日期(date/string)
     * @param dateMax 結束日期(date/string)
     * @return
     */
    public static <T> int betweenDays(T dateMin, T dateMax) {
        LocalDate start = new LocalDate(dateMin);
        LocalDate end = new LocalDate(dateMax);
        return Days.daysBetween(start, end).getDays();
    }

    /**
     * 12、計算兩個時間的毫秒間隔
     * 目前不對兩個時間參數比較大小,如放錯順序,則結果為負數的毫秒間隔
     *
     * @param dateMin 起點日期(date/string)
     * @param dateMax 結束日期(date/string)
     * @return
     */
    public static <T> long betweenMs(T dateMin, T dateMax) {
        DateTime start = new DateTime(dateMin);
        DateTime end = new DateTime(dateMax);
        return end.getMillis() - start.getMillis();
    }

    /**
     * 13、判斷是否為交易日/工作日
     *
     * @param date 待判斷日期(date/string)
     * @return
     */
    public static <T> boolean isTradeDay(T date) {
        boolean isTD = false;
        DateTime dt = new DateTime(date);
        if (isSpWorkDay(dt) || (!isHoliday(dt) && !isWeekEnd(dt))) {
            isTD = true;
        }
        return isTD;
    }
    //14、判斷是否是周末*/
    private static boolean isWeekEnd(DateTime dt) {
        boolean isWE = false;
        int wd = dt.dayOfWeek().get();
        switch (wd) {
            case 6:
            case 7:
                isWE = true;
                break;
            default:
                break;
        }
        return isWE;
    }

    //15、判斷是否為國家法定節假日*/
    private static boolean isHoliday(DateTime dt) {
        boolean isHD = false;
        //TODO:get days from redis
        List<String> holidayList = new ArrayList<String>();
        if (holidayList != null) {
            for (String holiday : holidayList) {
                if (dt.isEqual(new DateTime(holiday))) {
                    isHD = true;
                    break;
                }
            }
        }
        return isHD;
    }

    //16、判斷是否為國家調整后的工作日*/
    private static boolean isSpWorkDay(DateTime dt) {
        boolean isSpWD = false;
        //TODO:get days from redis
        List<String> spWorkDayList = new ArrayList<String>();
        if (spWorkDayList != null) {
            for (String spWorkDay : spWorkDayList) {
                if (dt.isEqual(new DateTime(spWorkDay))) {
                    isSpWD = true;
                    break;
                }
            }
        }
        return isSpWD;
    }

    /**
     */17、獲得時間指定時間差值 日期
     * @param: aDate
     * @param: field 查看  Calendar.MINUTE  、SECOND
     * @param: diff 時間差
     * @return:
     */
    public static final Date diffDate(Date aDate, int field, int diff) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(aDate);
        cal.add(field, diff);
        return cal.getTime();
    }

    /**
     * 18、判斷目標時間是否在區間內
     * @param sDate 開始時間date/string
     * @param eDate 結束時間date/string
     * @param cDate 目標時間date/string
     * @param <T>
     * @return
     */
    public static <T> boolean isInRange(T sDate, T eDate, T cDate){
        DateTime dtLow = new DateTime(sDate);
        DateTime dtHigh = new DateTime(eDate);
        DateTime dt = new DateTime(cDate);
        if(dt.getMillis()>=dtLow.getMillis() && dt.getMillis()<=dtHigh.getMillis()){
            return true;
        }
        return false;
    }
    public static <T> boolean isInRange(){
        DateTime now = DateTime.now();
        return isInRange(now,now,now);
    }
    public static <T> boolean isInRange(T sDate, T eDate){
        DateTime now = DateTime.now();
        return isInRange(sDate,eDate,now);
    }
   /**
    * 19、獲取當前8位系統日期
    *
    * @return yyyyMMdd
    */
   public static String getCurrentDateStr() {
       return format(LocalDate.now());
   }

   /**
    */20、獲取當前6位系統時間
    *
    * @return HHmmss
    */
   public static String getCurrentTimeStr() {
       return format(LocalTime.now());
   }

   /**
    */21、獲取當前14位系統日期時間
    *
    * @return yyyyMMddHHmmss
    */
   public static String getCurrentDateTimeStr() {
       return format(LocalDateTime.now());
   }

   /**
    */22、按指定格式獲取當前系統日期時間
    *
    * @param pattern pattern
    * @return 格式化的當前系統日期時間
    */
   public static String getCurrentDateTimeStr(String pattern) {
      return format(LocalDateTime.now(), pattern);
   }

   /**
   */23、獲取字符串start到end天數間隔
   *
   * @param start 開始日期,YYYYMMDD
   * @param end   結束日期,YYYYMMDD
   * @return 天數間隔
   */
   public static long getDaysBetweenDate(String start, String end) {
       return toLocalDate(start).until(toLocalDate(end), ChronoUnit.DAYS);
   }   

   /**
    */24、獲取Date日期類型start到end天數間隔
    *
    * @param start 開始日期
    * @param end   結束日期
    * @return 天數間隔
    */
   public static long getDaysBetween(Date start, Date end) {
       return getDaysBetween(toLocalDate(start), toLocalDate(end));
   }
   public static LocalDate toLocalDate(Date d) {
      return toLocalDateTime(d).toLocalDate();
   }
}

時間減法(示例):

public static void main(String[] args) throws ParseException {
        //一、時間減法可以用Calendar對象加法中,把第二個參數換成負數可以時間,這邊就不列舉了;使用第二種方式做時間減法
        //1、指定兩個Date對象,業務中可以以參數的形式傳遞,不用new當前時間。
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date nowDate = new Date(); //當前時間
        String yesterday = "2020-10-29 12:35:28";
        Date yesterdayDate = dateFormat.parse(yesterday);//假設一個時間,工作業務中可以參數傳遞的形式來獲取。
        //2、時間戳相減
        long yesterdayDateTime = yesterdayDate.getTime();//昨天的時間戳
        long nowDateTime = nowDate.getTime();//當前時間戳
        int result = (int) (nowDateTime - yesterdayDateTime);//毫秒
        //3、換算成秒
        int diffSecond = result / 1000; //1000毫秒等於1秒
        System.out.println(diffSecond); //108296 秒
        //4、換算成分鍾
        int diffMinute = result / 1000 / 60;//60秒等於1分鍾
        System.out.println(diffMinute);//1805 分鍾
        //5、換算成是小時
        int diffHour = result / 1000 / 60 / 60;//60分鍾等於1小時
        System.out.println(diffHour);//30小時
        //6、換算成天
        int diffDay = result / 86400000;
        System.out.println(diffDay);//1天
    }
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM