基於 JDK 8 time包的時間工具類

package com.et.oak.time;


import static java.time.temporal.ChronoField.DAY_OF_MONTH;
import static java.time.temporal.ChronoField.DAY_OF_YEAR;
import static java.time.temporal.ChronoUnit.MONTHS;
import static java.time.temporal.ChronoUnit.YEARS;
import static java.time.temporal.TemporalAdjusters.firstDayOfMonth;
import static java.time.temporal.TemporalAdjusters.firstDayOfNextMonth;
import static java.time.temporal.TemporalAdjusters.firstDayOfNextYear;
import static java.time.temporal.TemporalAdjusters.firstDayOfYear;
import static java.time.temporal.TemporalAdjusters.firstInMonth;
import static java.time.temporal.TemporalAdjusters.lastDayOfMonth;
import static java.time.temporal.TemporalAdjusters.lastDayOfYear;
import static java.time.temporal.TemporalAdjusters.next;
import static java.time.temporal.TemporalAdjusters.nextOrSame;
import static java.time.temporal.TemporalAdjusters.previous;
import static java.time.temporal.TemporalAdjusters.previousOrSame;


import java.time.DayOfWeek;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;


/**
 * 基於 JDK 8 time包的時間工具類
 * author: etoak
 */
public class EtoakTimeUtil {
/**
* 獲取默認時間格式: yyyy-MM-dd HH:mm:ss
*/
private static final DateTimeFormatter DEFAULT_DATETIME_FORMATTER = TimeFormat.LONG_DATE_PATTERN_LINE.formatter;


private EtoakTimeUtil() {
}


/**
* String 轉時間
*
* @param timeStr
* @return
*/
public static LocalDateTime parseTime(String timeStr) {
return LocalDateTime.parse(timeStr, DEFAULT_DATETIME_FORMATTER);
}


/**
* String 轉時間
*
* @param timeStr
* @param format
*            時間格式
* @return
*/
public static LocalDateTime parseTime(String timeStr, TimeFormat format) {
return LocalDateTime.parse(timeStr, format.formatter);
}


public static LocalDate parseLocalDate(String timeStr, TimeFormat format) {
return LocalDate.parse(timeStr, format.formatter);
}


/**
* 時間轉 String
*
* @param time
* @return
*/
public static String parseTime(LocalDateTime time) {
return DEFAULT_DATETIME_FORMATTER.format(time);
}


/**
* 時間轉 String
*
* @param time
* @param format
*            時間格式
* @return
*/
public static String parseTime(LocalDateTime time, TimeFormat format) {
return format.formatter.format(time);
}


public static String parseLocalDate(LocalDate time, TimeFormat format) {
return format.formatter.format(time);
}


/**
* 獲取當前時間
*
* @return
*/
public static String getCurrentDatetime() {
return DEFAULT_DATETIME_FORMATTER.format(LocalDateTime.now());
}


/**
* 獲取當前時間
*
* @param format
*            時間格式
* @return
*/
public static String getCurrentDatetime(TimeFormat format) {
return format.formatter.format(LocalDateTime.now());
}


/**
* 時間格式
*/
public enum TimeFormat {


/**
* 短時間格式
*/
SHORT_DATE_PATTERN_CHINESE("yyyy年MM月dd日"), SHORT_DATE_PATTERN_LINE("yyyy-MM-dd"), SHORT_DATE_PATTERN_SLASH(
"yyyy/MM/dd"), SHORT_DATE_PATTERN_DOUBLE_SLASH("yyyy\\MM\\dd"), SHORT_DATE_PATTERN_NONE("yyyyMMdd"),


/**
* 長時間格式
*/
LONG_DATE_PATTERN_LINE("yyyy-MM-dd HH:mm:ss"), LONG_DATE_PATTERN_SLASH(
"yyyy/MM/dd HH:mm:ss"), LONG_DATE_PATTERN_DOUBLE_SLASH(
"yyyy\\MM\\dd HH:mm:ss"), LONG_DATE_PATTERN_NONE("yyyyMMdd HH:mm:ss"),


/**
* 長時間格式 帶毫秒
*/
LONG_DATE_PATTERN_WITH_MILSEC_LINE("yyyy-MM-dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_SLASH(
"yyyy/MM/dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_DOUBLE_SLASH(
"yyyy\\MM\\dd HH:mm:ss.SSS"), LONG_DATE_PATTERN_WITH_MILSEC_NONE("yyyyMMdd HH:mm:ss.SSS");


private transient DateTimeFormatter formatter;


TimeFormat(String pattern) {
formatter = DateTimeFormatter.ofPattern(pattern);
}
}


/**
* 獲取Period(時間段)
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static Period LocalDateDiff(LocalDate lt, LocalDate gt) {
Period p = Period.between(lt, gt);
return p;
}


/**
* 獲取時間間隔,並格式化爲XXXX年XX月XX日
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static String localDateDiffFormat(LocalDate lt, LocalDate gt) {
Period p = Period.between(lt, gt);
String str = String.format(" %d年 %d月 %d日", p.getYears(), p.getMonths(), p.getDays());
return str;
}


/**
* 獲取Duration(持續時間)
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static Duration localTimeDiff(LocalTime lt, LocalTime gt) {
Duration d = Duration.between(lt, gt);
return d;
}


/**
* 獲取時間間隔(毫秒)
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static long millisDiff(LocalTime lt, LocalTime gt) {
Duration d = Duration.between(lt, gt);
return d.toMillis();
}


/**
* 獲取時間間隔(秒)
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static long secondDiff(LocalTime lt, LocalTime gt) {
Duration d = Duration.between(lt, gt);
return d.getSeconds();
}


/**
* 獲取時間間隔(天)
*
* @param format
*            較小時間
* @param format
*            較大時間
* @return
*/
public static long daysDiff(LocalDate lt, LocalDate gt) {
long daysDiff = ChronoUnit.DAYS.between(lt, gt);
return daysDiff;
}


/**
* 創建一個新的日期,它的值爲上月的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfLastMonth(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_MONTH, 1).plus(-1, MONTHS));


}
/**
* 創建一個新的日期,它的值爲上月的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfLastMonth(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_MONTH, temporal.range(DAY_OF_MONTH).getMaximum()).plus(-1, MONTHS));


}
/**
* 創建一個新的日期,它的值爲當月的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfMonth(LocalDate date) {
return date.with(firstDayOfMonth());


}
/**
* 創建一個新的日期,它的值爲當月的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfMonth(LocalDate date) {
return date.with(lastDayOfMonth());
}
/**
* 創建一個新的日期,它的值爲下月的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfNextMonth(LocalDate date) {
return date.with(firstDayOfNextMonth());


}
/**
* 創建一個新的日期,它的值爲下月的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfNextMonth(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_MONTH, temporal.range(DAY_OF_MONTH).getMaximum()).plus(1, MONTHS));


}



/**
* 創建一個新的日期,它的值爲上年的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfLastYear(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_YEAR, 1).plus(-1, YEARS));
}
/**
* 創建一個新的日期,它的值爲上年的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfLastYear(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_YEAR, temporal.range(DAY_OF_YEAR).getMaximum()).plus(-1, YEARS));
}


/**
* 創建一個新的日期,它的值爲當年的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfYear(LocalDate date) {
return date.with(firstDayOfYear());
}


/**
* 創建一個新的日期,它的值爲今年的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfYear(LocalDate date) {
return date.with(lastDayOfYear());
}


/**
* 創建一個新的日期,它的值爲明年的第一天

* @param date
* @return
*/
public static LocalDate getFirstDayOfNextYear(LocalDate date) {
return date.with(firstDayOfNextYear());
}


/**
* 創建一個新的日期,它的值爲明年的最後一天

* @param date
* @return
*/
public static LocalDate getLastDayOfNextYear(LocalDate date) {
return date.with((temporal) -> temporal.with(DAY_OF_YEAR, temporal.range(DAY_OF_YEAR).getMaximum()).plus(1, YEARS));
}


/**
* 創建一個新的日期,它的值爲同一個月中,第一個符合星期幾要求的值

* @param date
* @return
*/
public static LocalDate getFirstInMonth(LocalDate date, DayOfWeek dayOfWeek) {
return date.with(firstInMonth(dayOfWeek));
}


/**
* 創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星 期幾要求的日期

* @param date
* @return
*/
public static LocalDate getNext(LocalDate date, DayOfWeek dayOfWeek) {
return date.with(next(dayOfWeek));
}


/**
* 創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星 期幾要求的日期

* @param date
* @return
*/
public static LocalDate getPrevious(LocalDate date, DayOfWeek dayOfWeek) {
return date.with(previous(dayOfWeek));
}


/**
* 創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星 期幾要求的日期,如果該日期已經符合要求,直接返回該對象

* @param date
* @return
*/
public static LocalDate getNextOrSame(LocalDate date, DayOfWeek dayOfWeek) {
return date.with(nextOrSame(dayOfWeek));
}


/**
* 創建一個新的日期,並將其值設定爲日期調整後或者調整前,第一個符合指定星 期幾要求的日期,如果該日期已經符合要求,直接返回該對象

* @param date
* @return
*/
public static LocalDate getPreviousOrSame(LocalDate date, DayOfWeek dayOfWeek) {
return date.with(previousOrSame(dayOfWeek));
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章