話不多少,直接上代碼!時間工具類DateTimeUtils.java 匯總了以前常用的時間操作方法!
工具類方法列表:
- 將 String 轉為 date
- 日期字符串格式化輸出
- Date類型日期轉字符串格式化輸出
- 增加天數后的Date日期
- 計算日期{@link Date}增加某天數后的Date類型日期
- 減少天數后的日期
- 增加月數后的日期
- 減少月數后的日期
- 減少年數后的日期
- 計算月份差
- 計算兩個日期的間隔天數/比較日期大小
- 計算兩個時間的毫秒間隔
- 計算兩個時間的 分鍾差
- 判斷是否為交易日/工作日
- 判斷是否是周末
- 判斷是否為國家法定節假日
- 判斷是否為國家調整后的工作日
- 獲得時間指定時間差值 日期
- 判斷目標時間是否在區間內
- 獲取當前8位系統日期
- 獲取當前6位系統時間
- 獲取當前14位系統日期時間
- 按指定格式獲取當前系統日期時間
- 獲取字符串start到end天數間隔
- 獲取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天 } }
