java8時間工具類

記錄一個比較全的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();
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章