記錄一個比較全的java8操作時間的工具類:
package com.wm.test.util;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.Locale;
/***
* @ClassName: DateUtil
* @Description: java8日期工具類
* @Author: wm_yu
* @Create_time: 15:14 2019-10-26
*/
@Slf4j
public class DateUtil {
public final static String DATE_PATTERN_STRING = "yyyy-MM-dd";
/**
* 年-月-日 時:分:秒 標準樣式
*/
public final static String DEFAULT_PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
/**
* localDate轉換爲Date
* @return
*/
public static Date localDateToDate(LocalDate localDate){
ZoneId zoneId = ZoneId.systemDefault();
ZonedDateTime zdt = localDate.atStartOfDay(zoneId);
return Date.from(zdt.toInstant());
}
/**
* Date轉換爲localDate
* @param date
* @return
*/
public static LocalDate dateToLocalDate(Date date){
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();
// atZone()方法返回在指定時區從此Instant生成的ZonedDateTime。
return instant.atZone(zoneId).toLocalDate();
}
/**
* localDateTime轉換爲date
* @return
*/
public static Date localDateTimeToDate(LocalDateTime localDateTime){
ZoneId zone = ZoneId.systemDefault();
Instant instant = localDateTime.atZone(zone).toInstant();
//localDateTime轉date
return Date.from(instant);
}
/**
* Date轉換爲localDateTime
* @param date
* @return
*/
public static LocalDateTime dateToLocalDateTime(Date date){
Instant instant = date.toInstant();
ZoneId zone = ZoneId.systemDefault();
//date轉localDateTime
return LocalDateTime.ofInstant(instant, zone);
}
/**
* 獲取兩個字符串日期的相差天數
* @param startDateString
* @param endDateString
* @param formatString
* @return
*/
public static long getDays(String startDateString,String endDateString,String formatString){
try {
if(StringUtils.isEmpty(formatString)){
formatString = DATE_PATTERN_STRING;
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(formatString);
LocalDate startDate = LocalDate.parse(startDateString, formatter);
LocalDate endDate = LocalDate.parse(endDateString, formatter);
long days = endDate.toEpochDay() - startDate.toEpochDay();
return days;
} catch (Exception e) {
log.error("時間解析異常:{}",e.getMessage(),e);
}
return 0;
}
/**
* 格式化年月日爲字符串
*
* @param date 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @return String 返回格式化的日期
*/
public static String formatterLocalDateToString(Date date, String pattern) {
LocalDate localDate = dateToLocalDate(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
return getLocalDateFormat(localDate, dateTimeFormatter);
}
/**
* 格式化年月日時分秒爲字符串
*
* @param date 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @return String 返回格式化的日期
*/
public static String formatterLocalDateTimeToString(Date date, String pattern) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
return getLocalDateTimeFormat(localDateTime, dateTimeFormatter);
}
/**
* 時區格式化年月日爲字符串
*
* @param date 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @param locale 國際時區 Locale.CHINA
* @return String 返回格式化的日期
*/
public static String formatterLocalDateToString(Date date,String pattern,Locale locale) {
LocalDate localDate = dateToLocalDate(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern, locale);
return getLocalDateFormat(localDate, dateTimeFormatter);
}
/**
* 時區格式化年月日時分秒爲字符串
*
* @param date 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @param locale 國際時區 Locale.CHINA
* @return String 返回格式化的日期
*/
public static String formatterLocalDateTimeToString(Date date,String pattern,Locale locale) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern, locale);
return getLocalDateTimeFormat(localDateTime, dateTimeFormatter);
}
/**
* LocalDate格式化日期爲日期格式
*
* @param localDate 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @return String 返回格式化的日期
*/
public static LocalDate formatterStringToLocalDate(String localDate, String pattern) {
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
return getLocalDateParse(localDate, dateTimeFormatter);
}
/**
* localDateTime格式化日期爲日期格式
* @param localDateTime 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @return String 返回格式化的日期
*/
public static LocalDateTime formatterStringToLocalDateTime(String localDateTime, String pattern) {
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
return getLocalDateTimeParse(localDateTime, dateTimeFormatter);
}
/**
* 日期格式化日期,轉化爲日期格式 localDate 轉 LocalDate
* @param date 傳入的日期
* @param pattern 轉化的格式
* @return 返回結果 LocalDate
*/
public static LocalDate formatterDateToLocalDateTime(Date date,String pattern) {
LocalDate localDate = dateToLocalDate(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
String formatterDateTime = getLocalDateFormat(localDate, dateTimeFormatter);
return getLocalDateParse(formatterDateTime);
}
/**
* 日期格式化日期,轉化爲日期格式 localDateTime 轉 localDateTime
*
* @param date 傳入需要格式化的日期
* @param pattern 需要格式化的格式
* @return String 返回格式化的日期
*/
public static LocalDateTime formatterDateTimeToLocalDateTime(Date date,String pattern) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(pattern);
String formatterDateTime = getLocalDateTimeString(localDateTime, dateTimeFormatter);
return getLocalDateTimeParse(formatterDateTime, dateTimeFormatter);
}
/**
* 格式化日期格式 yyyy-MM-dd HH:mm:ss
*
* @param date 傳入需要格式化的日期
* @return 返回格式化後的日期字符串
*/
public static String getAllFormatterLocalDateTime(Date date) {
LocalDateTime localDateTime = dateToLocalDateTime(date);
DateTimeFormatter dateTimeFormatter = getDateTimeFormatter(DEFAULT_PATTERN_DATETIME);
return getLocalDateTimeFormat(localDateTime, dateTimeFormatter);
}
/**
* 獲取LocalDate轉化爲字符串
*
* @param formatterDateTime 需要轉化的數據
* @return LocalDate
*/
private static LocalDate getLocalDateParse(String formatterDateTime) {
return LocalDate.parse(formatterDateTime);
}
/**
* 獲取LocalDate按要求轉化爲字符串
*
* @param formatterDateTime 需要轉化的數據
* @param dateTimeFormatter 格式化
* @return LocalDate
*/
private static LocalDate getLocalDateParse(String formatterDateTime, DateTimeFormatter dateTimeFormatter) {
return LocalDate.parse(formatterDateTime, dateTimeFormatter);
}
/**
* 獲取LocalDate按照要求轉化爲字符串
*
* @param localDate 需要轉化的數據
* @param dateTimeFormatter 轉化的格式
* @return 轉化後返回字符串
*/
private static String getLocalDateFormat(LocalDate localDate, DateTimeFormatter dateTimeFormatter) {
return dateTimeFormatter.format(localDate);
}
/**
* 獲取LocalDateTime按照要求轉化爲字符串
*
* @param localDateTime 需要轉化的數據
* @param dateTimeFormatter 轉化的格式
* @return 返回結果
*/
private static String getLocalDateTimeFormat(LocalDateTime localDateTime, DateTimeFormatter dateTimeFormatter) {
return localDateTime.format(dateTimeFormatter);
}
/**
* 獲取數據按照國際標準轉化的值
*
* @param pattern 需要轉化的數據
* @param locale 傳入國際時間
* @return 返回格式結果
*/
private static DateTimeFormatter getDateTimeFormatter(String pattern, Locale locale) {
return DateTimeFormatter.ofPattern(pattern, locale);
}
/**
* 獲取localDateTime按照國際標準轉化的值
*
* @param localDateTime 需要轉化的數據
* @param dateTimeFormatter 格式化
* @return 返回 LocalDateTime
*/
private static LocalDateTime getLocalDateTimeParse(String localDateTime, DateTimeFormatter dateTimeFormatter) {
return LocalDateTime.parse(localDateTime, dateTimeFormatter);
}
/**
* 獲取格式化的結果
* @param pattern 傳入的格式
* @return 返回格式化結果
*/
private static DateTimeFormatter getDateTimeFormatter(String pattern) {
return DateTimeFormatter.ofPattern(pattern);
}
/**
* 獲取格式化LocalDateTime結果
*
* @param localDateTime 傳入的數據
* @param dateTimeFormatter 格式化的結果
* @return 返回字符串
*/
private static String getLocalDateTimeString(LocalDateTime localDateTime, DateTimeFormatter dateTimeFormatter) {
return dateTimeFormatter.format(localDateTime);
}
/**
* 獲取今天星期幾
*
* @param instant JDK8 代替Date使用的類
* @return 當前的星期
*/
private static DayOfWeek getDayOfWeek(Instant instant) {
// ZoneId.systemDefault() 設置當前時區爲系統默認時區
LocalDateTime localDateTime = getLocalDateAboutInstant(instant);
return localDateTime.getDayOfWeek();
}
/**
* 獲取instant 轉化的日期格式
*
* @param instant DK8 代替Date使用的類
* @return 時間格式
*/
private static LocalDateTime getLocalDateAboutInstant(Instant instant) {
return instantToLocalDateTime(instant);
}
/**
* 獲取本週開始時間
*
* @param localDateTime 輸入日期
* @return 返回本週開始時間
*/
public static LocalDateTime getTodayFirstOfWeek(LocalDateTime localDateTime) {
TemporalAdjuster temporalAdjuster = getFirstTemporalAdjuster();
return localDateTime.with(temporalAdjuster);
}
/**
* 獲取本週結束時間
*
* @param localDateTime 輸入日期
* @return 本週結束時間
*/
public static LocalDateTime getTodayLastOfWeek(LocalDateTime localDateTime) {
TemporalAdjuster temporalAdjuster = getLastTemporalAdjuster();
return localDateTime.with(temporalAdjuster);
}
/**
* 本週開始時間
*
* @return 返回本週開始時間
*/
private static TemporalAdjuster getFirstTemporalAdjuster() {
return TemporalAdjusters.ofDateAdjuster(
localDate -> localDate.minusDays(localDate.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
}
/**
* 本週結束時間
*
* @return 返回本週結束時間
*/
private static TemporalAdjuster getLastTemporalAdjuster() {
return TemporalAdjusters.ofDateAdjuster(
localDate -> localDate.plusDays(DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
}
/**
* 獲取天的開始時間
*
* @param day 0 今天 1 明天 -1 昨天
* @return 開始時間
*/
public static LocalDateTime getTodayStartTime(int day) {
return LocalDate.now().plusDays(day).atStartOfDay();
}
/**
* 獲取某月的開始時間
*
* @param month 0 本月 1 下月 -1 上月
* @return 月開始的時間
*/
public static LocalDate getMonthStartTime(int month) {
return LocalDate.now().plusMonths(month).with(TemporalAdjusters.firstDayOfMonth());
}
/**
* 獲取某年的開始時間
*
* @param year 0 今年 1 明年 -1 前年
* @return 年的開始時間
*/
public static LocalDate getYearStartTime(int year) {
return LocalDate.now().plusYears(year).with(TemporalAdjusters.firstDayOfYear());
}
/**
* 獲取某天的結束時間
*
* @return 天的結束時間 ZoneId.systemDefault()系統默認時區,如果需要改變時區使用ZoneId.of("時區")
*/
public static LocalDateTime getTodayEndTime() {
return LocalDateTime.of(LocalDate.now(ZoneId.systemDefault()), LocalTime.MIDNIGHT);
}
/**
* 獲取某月的結束時間
*
* @param day 0 本月 1 下月 -1 上月
* @return 月的結束時間
*/
public static LocalDate getMonthEndTime(int day) {
return LocalDate.now().plusDays(day).with(TemporalAdjusters.lastDayOfMonth());
}
/**
* 獲取某年的結束時間
*
* @param year 0 今年 1 明年 -1 前年
* @return 年的結束時間
*/
public static LocalDate getYearEndTime(int year) {
return LocalDate.now().plusYears(year).with(TemporalAdjusters.lastDayOfYear());
}
/**
* 獲取今天中午的時間
*
* @return 今天中午的時間
*/
public static LocalDateTime getTodayNoonTime() {
return LocalDateTime.of(LocalDate.now(ZoneId.systemDefault()), LocalTime.NOON);
}
/**
* 獲取月份
*
* @param month 月份
* @return 數值
*/
private static int getMonth(Month month) {
return month.getValue();
}
/**
* 在日期上增加數個整天
*
* @param instant 輸入日期
* @param day 增加或減少的天數
* @return 增加或減少後的日期
*/
public static LocalDateTime addDay(Instant instant,int day) {
LocalDateTime localDateAboutInstant = getLocalDateAboutInstant(instant);
return localDateAboutInstant.plusDays(day);
}
/**
* 在日期上增加/減少(負數)數個小時
*
* @param instant 輸入時間
* @param hour 增加/減少的小時數
* @return 增加/減少小時後的日期
*/
public static LocalDateTime addDateHour(Instant instant,
int hour) {
LocalDateTime localDateAboutInstant = getLocalDateAboutInstant(instant);
return localDateAboutInstant.plusHours(hour);
}
/**
* 在日期上增加/減少數個分鐘
*
* @param instant 輸入時間
* @param minutes 增加/減少的分鐘數
* @return 增加/減少分鐘後的日期
*/
public static LocalDateTime addDateMinutes(Instant instant,
int minutes) {
LocalDateTime localDateAboutInstant = getLocalDateAboutInstant(instant);
return localDateAboutInstant.plusMinutes(minutes);
}
/**
* 得到兩個日期時間的差額(毫秒)
*
* @param startTime 開始時間
* @param endTime 結束時間
* @return 兩個時間相差多少秒
*/
public static long differenceDateMillis(LocalDateTime startTime,
LocalDateTime endTime) {
Duration between = Duration.between(startTime, endTime);
return between.toMillis();
}
/**
* 得到兩個日期時間的差額(分)
*
* @param startTime 開始時間
* @param endTime 結束時間
* @return 兩個時間相差多少分
*/
public static long differenceDateMinutes(LocalDateTime startTime,
LocalDateTime endTime) {
Duration between = Duration.between(startTime, endTime);
return between.toMinutes();
}
/**
* 得到兩個日期時間的差額(小時)
*
* @param startTime 開始時間
* @param endTime 結束時間
* @return 兩個時間相差多少小時
*/
public static long differenceDateHours(LocalDateTime startTime,
LocalDateTime endTime) {
Duration between = Duration.between(startTime, endTime);
return between.toHours();
}
/**
* 得到兩個日期時間的差額(天)
*
* @param startTime 開始時間
* @param endTime 結束時間
* @return 兩個時間相差多少天
*/
public static long differenceDateDays(LocalDateTime startTime,
LocalDateTime endTime) {
Duration between = Duration.between(startTime, endTime);
return between.toDays();
}
/**
* 獲取指定日期的月份
*
* @param localDateTime 輸入日期
* @return 返回指定日期的月份
*/
public static int getMonthAboutLocalTime(LocalDateTime localDateTime) {
Month month = localDateTime.getMonth();
return getMonth(month);
}
/**
* 獲取指定日期的年份
*
* @param localDateTime 輸入日期
* @return 返回指定日期的年份
*/
public static int getYearAboutLocalTime(LocalDateTime localDateTime) {
return localDateTime.getYear();
}
/**
* 獲取指定日期的天數
*
* @param localDateTime 輸入日期
* @return 返回指定日期的天數
*/
public static int getDayAboutLocalTime(LocalDateTime localDateTime) {
return localDateTime.getDayOfMonth();
}
/**
* 獲取指定日期的星期
*
* @param localDateTime 輸入日期
* @return 返回指定日期的星期
*/
public static int getWeekDayAboutLocalTime(LocalDateTime localDateTime) {
return localDateTime.getDayOfWeek().getValue();
}
/**
* 獲取指定日期的時間
*
* @param localDateTime 輸入日期
* @return 返回指定日期的時間
*/
public static int getHouryAboutLocalTime(LocalDateTime localDateTime) {
return localDateTime.getHour();
}
/**
* 獲取指定日期的所在月的最後一天
*
* @param localDateTime 輸入日期
* @return 返回指定日期的時間
*/
public static int getLateDayFromMonth(LocalDateTime localDateTime) {
return localDateTime.with(TemporalAdjusters.lastDayOfMonth()).getDayOfMonth();
}
/**
* 獲取指定日期的所在月的第一天
*
* @param localDateTime 輸入日期
* @return 返回指定日期的時間
*/
public static LocalDateTime getFirstDayFromMonth(LocalDateTime localDateTime) {
return localDateTime.with(TemporalAdjusters.firstDayOfMonth());
}
/**
* 獲取到指定日期一個月有幾天
*
* @param instant 輸入日期
* @return 天數
*/
public static int getDayCountOfMonth(Instant instant) {
LocalDateTime localDateTime = instantToLocalDateTime(instant);
LocalDateTime startTime = localDateTime.with(TemporalAdjusters.firstDayOfMonth());
LocalDateTime endTime = localDateTime.with(TemporalAdjusters.lastDayOfMonth());
Duration between = Duration.between(startTime, endTime);
return (int) between.toDays() + 1;
}
/**
* LocalDateTime 轉化爲 Instant
*
* @param localDateTime 輸入的時間
* @return Instant的日期類型
*/
public static Instant localDateTimeToInstant(LocalDateTime localDateTime) {
return localDateTime.atZone(ZoneId.systemDefault()).toInstant();
}
/**
* LocalDateTime 轉化爲 LocalDate
*
* @param localDateTime 輸入的時間
* @return LocalDate的日期類型
*/
public static LocalDate localDateTimeTolocalDate(LocalDateTime localDateTime) {
return localDateTime.toLocalDate();
}
/**
* LocalDate 轉化爲 LocalDateTime
*
* @param localDate 輸入的時間
* @return LocalDateTime的日期類型
*/
public static LocalDateTime localDateTimeTolocalDate(LocalDate localDate) {
return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toLocalDateTime();
}
/**
* instant 轉化爲 LocalDateTime
*
* @param instant 輸入的時間
* @return LocalDateTime的日期類型
*/
public static LocalDateTime instantToLocalDateTime(Instant instant) {
return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
}
/**
* instant 轉化爲 LocalDate
*
* @param instant 輸入的時間
* @return LocalDate的日期類型
*/
public static LocalDate instantToLocalDate(Instant instant) {
return instant.atZone(ZoneOffset.ofHours(8)).toLocalDate();
}
/**
* 獲取本週的週一日期
*
* @return 獲取本週的週一日期
*/
public static LocalDateTime getMondayThisWeek() {
LocalDateTime todayFirstOfWeek = getTodayFirstOfWeek(getTodayStartTime(0));
return todayFirstOfWeek.with(getFirstTemporalAdjuster());
}
/**
* 獲取本週的週日日期
*
* @return 獲取本週的週日日期
*/
public static LocalDateTime getSundayThisWeek() {
LocalDateTime todayFirstOfWeek = getTodayLastOfWeek(getTodayStartTime(0));
return todayFirstOfWeek.with(getFirstTemporalAdjuster());
}
/**
* 獲取上週週一的日期
*
* @return 獲取上週週一的日期
*/
public static LocalDateTime getMondayPreviousWeek() {
return getMondayThisWeek().minusDays(7);
}
/**
* 獲取上週週日的日期
*
* @return 獲取上週週日的日期
*/
public static LocalDateTime getSundayPreviousWeek() {
return getSundayThisWeek().minusDays(8);
}
/**
* LocalDate轉時間戳
*
* @param localDate 時間輸入
* @return 時間戳
*/
public static Long getLocalDateToMillis(LocalDate localDate) {
return localDate.atStartOfDay(ZoneOffset.ofHours(8)).toInstant().toEpochMilli();
}
/**
* LocalDateTime轉時間戳
*
* @param localDateTime 時間輸入
* @return 時間戳
*/
public static Long getLocalDateTimeToMillis(LocalDateTime localDateTime) {
return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
}
/**
* 毫秒值轉LocalDate
*
* @param timeStamp 時間戳毫秒值
* @return LocalDate
*/
public static LocalDate getMillisToLocalDate(long timeStamp) {
return Instant.ofEpochMilli(timeStamp).atZone(ZoneOffset.ofHours(8)).toLocalDate();
}
/**
* 毫秒值轉LocalDateTime
*
* @param timeStamp 時間戳毫秒值
* @return LocalDateTime
*/
public static LocalDateTime getMillisToLocalDateTime(long timeStamp) {
return Instant.ofEpochMilli(timeStamp).atZone(ZoneOffset.ofHours(8)).toLocalDateTime();
}
/**
* 毫秒值加一年後的毫秒值
*
* @param original 毫秒值
* @return 毫秒值
*/
public static long getNextYear(long original) {
LocalDateTime millisToLocalDateTime = getMillisToLocalDateTime(original);
return millisToLocalDateTime.minus(1, ChronoUnit.YEARS).toInstant(ZoneOffset.ofHours(8)).toEpochMilli();
}
}