時間工具類-- LocalDateTimeUtil

一、工具類 API

API 說明
LocalDateTime.now() 當前時間
getMilliByTime( LocalDateTime.now()) 當前時間秒數
getSecondsByTime( LocalDateTime.now()) 當前時間毫秒數
getDayStart( LocalDateTime.now()) 指定任意一天的開始時間 (00:00:00)
getDayEnd(LocalDateTime.now()) 指定任意一天的結束時間 (23:59:59:999999999)
of(2020, 1, 1, 12, 00, 00, 999999999) 構建自定義時間
formatTime(time, “yyyy-MM-dd HH:mm:ss:SSS”) 指定格式
subtract(LocalDateTime.now(), N, ChronoUnit…) N 秒/分/時/天/月/年前 (ChronoUnit 單位)

ChronoUnit.MILLIS – 毫秒
ChronoUnit.SECONDS – 秒
MINUTES – 分
HOURS – 時
HALF_DAYS – 半天=12小時
DAYS – 天
YEARS – 年
plus(LocalDateTime.now(), N, ChronoUnit…) N 秒/分/時/天/月/年後 (ChronoUnit 單位同上)
betweenTwoTime(t1, t2, ChronoUnit…)) 兩個時間的時間差(ChronoUnit 單位同上)
isBefore(t1, t2) 時間大小 - ( t1 < t2 = true )
isAfter(t1, t2) 時間大小 - ( t1 > t2 = true )
week(time) 周幾
weekFirst(N) N周前 / 後的週一

上週的週一 weekFirst(-1)
本週的週一 weekFirst(0)
下週的週一 weekFirst(1)
weekLast(N) N周前 / 後的週末 (同上)
monthFirst(N) N月前 / 後月初 = 1號

上月初 weekFirst(-1)
本月初 weekFirst(0)
下月初 weekFirst(1)
monthLast(N) N月前 / 後月位(同上) 30/31/2月28/2月29
LocalDateTimeUtil.getDateDaysUpList(N) 當前月初到下N月底的每一天

List< DateDays(dayTime,week)
Time:每天時間
week:周幾

二、LocalDateTimeUtil 工具類

package com.rely.base.utils;

import lombok.AllArgsConstructor;
import lombok.Data;

import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.TemporalUnit;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * TODO 時間處理工具類
 *
 * @author ws
 * @mail [email protected]
 * @date 2020/4/24 0024 9:54
 * @return
 */
public class LocalDateTimeUtil {

    //獲取當前時間的LocalDateTime對象
    //LocalDateTime.now();

    //根據年月日構建LocalDateTime
    //LocalDateTime.of();

    //比較日期先後
    //LocalDateTime.now().isBefore(),
    //LocalDateTime.now().isAfter(),

    // TODO  獲取當前時間
    public static LocalDateTime now() {
        return LocalDateTime.now();
    }

    // TODO  獲取指定時間是周幾
    public static int week(LocalDateTime time) {
        return time.getDayOfWeek().getValue();
    }

    // TODO  獲取加或減N月的第一天
    public static LocalDateTime monthFirst(int num) {
        LocalDateTime newTime = plus(LocalDateTime.now(), num, ChronoUnit.MONTHS);
        newTime = newTime.with(TemporalAdjusters.firstDayOfMonth());
        return getDayStart(newTime);
    }

    // TODO  獲取加或減N月的最後天
    public static LocalDateTime monthLast(int num) {
        LocalDateTime newTime = plus(LocalDateTime.now(), num, ChronoUnit.MONTHS);
        newTime = newTime.with(TemporalAdjusters.lastDayOfMonth());
        return getDayEnd(newTime);
    }


    // TODO 獲取加或減N周的第一天
    public static LocalDateTime weekFirst(int num) {
        int week = week(LocalDateTime.now());
        LocalDateTime newTime = subtract(LocalDateTime.now(), week - 1, ChronoUnit.DAYS);
        newTime = plus(newTime, num * 7, ChronoUnit.DAYS);
        //formatTime(, "yyyy-MM-dd HH:mm:ss:SSS");
        return getDayStart(newTime);
    }

    // TODO  獲取加或減N周的最後一天
    public static LocalDateTime weekLast(int num) {
        int week = week(LocalDateTime.now());
        LocalDateTime newTime = plus(LocalDateTime.now(), 7 - week, ChronoUnit.DAYS);
        newTime = plus(newTime, num * 7, ChronoUnit.DAYS);
        return getDayEnd(newTime);
    }


    // TODO  判斷時間 ==>  t1 < t2 = true (2019-10-13 11:11:00 < 2020-11-13 13:13:00 = true)
    public static boolean isBefore(LocalDateTime t1, LocalDateTime t2) {
        return t1.isBefore(t2);
    }

    // TODO  判斷時間 ==>  t1 > t2 = true(2019-10-13 11:11:00 > 2020-11-13 13:13:00 = false)
    public static boolean isAfter(LocalDateTime t1, LocalDateTime t2) {
        return t1.isAfter(t2);
    }

    // TODO  自構建 LocalDateTime ==> 年,月,日,時,分
    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute) {
        return LocalDateTime.of(year, month, dayOfMonth, hour, minute);
    }

    // TODO  自構建 LocalDateTime ==> 年,月,日,時,分,秒,毫秒(精確到9位數)
    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
        return LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
    }

    // TODO  Date 轉 LocalDateTime
    public static LocalDateTime convertDateToLDT(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    // TODO  LocalDateTime 轉 Date
    public static Date convertLDTToDate(LocalDateTime time) {
        return Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
    }

    // TODO  獲取指定日期的毫秒
    public static Long getMilliByTime(LocalDateTime time) {
        return time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
    }

    // TODO  獲取指定日期的秒
    public static Long getSecondsByTime(LocalDateTime time) {
        return time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
    }

    // TODO 獲取指定時間的指定格式 ==> yyyy-MM-dd HH:mm:ss:SSS  (HH是24小時制,而hh是12小時制, ss是秒,SSS是毫秒)
    public static String formatTime(LocalDateTime time, String pattern) {
        return time.format(DateTimeFormatter.ofPattern(pattern));
    }

    // TODO 日期加上一個數,根據field不同加不同值,field爲ChronoUnit.*
    public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) {
        return time.plus(number, field);
    }

    // TODO 日期減去一個數,根據field不同減不同值,field參數爲ChronoUnit.*
    public static LocalDateTime subtract(LocalDateTime time, long number, TemporalUnit field) {
        return time.minus(number, field);
    }


    /**
     * TODO 獲取兩個日期的差  field參數爲ChronoUnit.*
     *
     * @param startTime
     * @param endTime
     * @param field     單位(年月日時分秒)
     **/
    public static long betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) {
        Period period = Period.between(LocalDate.from(startTime), LocalDate.from(endTime));
        if (field == ChronoUnit.YEARS) {
            return period.getYears();
        }
        if (field == ChronoUnit.MONTHS) {
            return period.getYears() * 12 + period.getMonths();
        }
        return field.between(startTime, endTime);
    }


    // TODO  獲取指定某一天的開始時間 00:00:00
    public static LocalDateTime getDayStart(LocalDateTime time) {
        return time.withHour(0)
                .withMinute(0)
                .withSecond(0)
                .withNano(0);
    }


    // TODO 獲取指定某一天的結束時間  23:59:59.999
    public static LocalDateTime getDayEnd(LocalDateTime time) {
        return time
                //.withDayOfMonth(1)    // 月
                //.withDayOfYear(2)     // 天
                .withHour(23)           // 時
                .withMinute(59)         // 分
                .withSecond(59)         // 秒
                .withNano(999999999);   // 毫秒(這裏精確到9位數)
    }

    //獲取本週週一
    public static LocalDateTime getWeekOfFirst(LocalDateTime time){
        return time.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).
                plusDays(1).withHour(0).withMinute(0).withSecond(0);
    }

    //獲取本週週日
    public static LocalDateTime getWeekOfLast(LocalDateTime time){
        return time.with(TemporalAdjusters.next(DayOfWeek.MONDAY)).
                minusDays(1).withHour(23).withMinute(59).withSecond(59);
    }

    //獲取本月第一天
    public static LocalDateTime getMonthOfFirst(LocalDateTime time){
        LocalDateTime firstday = time.with(TemporalAdjusters.firstDayOfMonth());
        return LocalDateTime.of(firstday.toLocalDate(), LocalTime.MIN);
    }

    //獲取本月最後一天
    public static LocalDateTime getMonthOfLast(LocalDateTime time){
        LocalDateTime lastDay = time.with(TemporalAdjusters.lastDayOfMonth());
        return LocalDateTime.of(lastDay.toLocalDate(),LocalTime.MAX);
    }

    // TODO 獲取當前時間月到 +N月的所有時間,一天一條數據 List<DateDays>
    public static List<DateDays> getDateDaysUpList(Integer num) {
        LocalDateTime startTime = monthFirst(0);        // 本月第一天  00:00:00
        LocalDateTime entTime = monthLast(num);              // 兩月後的最後一天 23:59:59.999
        // 3個月的數據
        List<DateDays> everyDays = new ArrayList<>();
        // 第一天數據
        everyDays.add(new DateDays(startTime, week(startTime)));
        while (true) {
            // 獲取一天後時間
            LocalDateTime nextDay = plus(everyDays.get(everyDays.size() - 1).dayTime, 1, ChronoUnit.DAYS);
            //大於兩月後最後一天-跳出循環
            if (isAfter(nextDay, entTime)) {
                break;
            }
            everyDays.add(new DateDays(nextDay, week(nextDay)));
        }
        return everyDays;
    }

    /**
     * TODO  獲取日期端的數據保存對象
     *
     * @author ws
     * @mail [email protected]
     * @date 2020/5/7 0007 9:41
     */
    @Data
    @AllArgsConstructor
    public static class DateDays {
        //當天時間- 年月日/00:00:00
        private LocalDateTime dayTime;
        //當天是周幾
        private int week;

    }

 

三、工具類測試

    /**
     * TODO  測試方法
     *
     * @param args
     * @return void
     * @author ws
     * @mail [email protected]
     * @date 2020/4/24 0024 15:54
     */
    public static void main(String[] args) {
        System.out.println("當前時間 ==> " + LocalDateTime.now());
        System.out.println("當前時間秒數 ==> " + getMilliByTime(LocalDateTime.now()));
        System.out.println("當前時間毫秒數 ==> " + getSecondsByTime(LocalDateTime.now()));
        System.out.println("===========================================================");

        System.out.println("今天開始時間 ==> " + getDayStart(LocalDateTime.now()));
        System.out.println("今天結束時間 ==> " + getDayEnd(LocalDateTime.now()));
        System.out.println("構建自定義時間 ==> " + of(2020, 1, 1, 12, 00, 00, 999999999));
        System.out.println("指定格式 ==>  " + formatTime(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss:SSS"));

        System.out.println("=========================" + LocalDateTime.now() + " 之前 ==================================");
        System.out.println("10秒前 ==> " + subtract(LocalDateTime.now(), 10, ChronoUnit.SECONDS));
        System.out.println("10分前 ==> " + subtract(LocalDateTime.now(), 10, ChronoUnit.MINUTES));
        System.out.println("一小時前 ==> " + subtract(LocalDateTime.now(), 1, ChronoUnit.HOURS));
        System.out.println("半天前 ==> " + subtract(LocalDateTime.now(), 1, ChronoUnit.HALF_DAYS));
        System.out.println("一天前 ==> " + subtract(LocalDateTime.now(), 1, ChronoUnit.DAYS));
        System.out.println("一月前 ==> " + subtract(LocalDateTime.now(), 1, ChronoUnit.MONTHS));
        System.out.println("一年前 ==> " + subtract(LocalDateTime.now(), 1, ChronoUnit.YEARS));
        System.out.println("==========================" + LocalDateTime.now() + " 之後 ===================================");
        System.out.println("10秒後 ==> " + plus(LocalDateTime.now(), 10, ChronoUnit.SECONDS));
        System.out.println("10分後 ==> " + plus(LocalDateTime.now(), 10, ChronoUnit.MINUTES));
        System.out.println("一小時後 ==> " + plus(LocalDateTime.now(), 1, ChronoUnit.HOURS));
        System.out.println("半天后 ==> " + plus(LocalDateTime.now(), 1, ChronoUnit.HALF_DAYS));
        System.out.println("一天後 ==> " + plus(LocalDateTime.now(), 1, ChronoUnit.DAYS));
        System.out.println("一月後 ==> " + plus(LocalDateTime.now(), 1, ChronoUnit.MONTHS));
        System.out.println("一年後 ==> " + plus(LocalDateTime.now(), 1, ChronoUnit.YEARS));
        System.out.println("================================= 時間差 =====================================");
        //  輸出 ====>
        LocalDateTime start = LocalDateTime.of(2019, 10, 13, 11, 11);
        LocalDateTime end = LocalDateTime.of(2020, 11, 13, 13, 13);
        System.out.println("輸出:" + formatTime(start, "yyyy-MM-dd HH:mm:ss") + " -到- " + formatTime(end, "yyyy-MM-dd HH:mm:ss") + "的時間差");                                     //====> 年:1
        System.out.println("年:" + betweenTwoTime(start, end, ChronoUnit.YEARS));      // ====> 年:1
        System.out.println("月:" + betweenTwoTime(start, end, ChronoUnit.MONTHS));     // ====> 月:13
        System.out.println("日:" + betweenTwoTime(start, end, ChronoUnit.DAYS));       // ====> 日:396
        System.out.println("半日:" + betweenTwoTime(start, end, ChronoUnit.HALF_DAYS));// ====> 半日:792
        System.out.println("小時:" + betweenTwoTime(start, end, ChronoUnit.HOURS));    // ====> 小時:9506
        System.out.println("分鐘:" + betweenTwoTime(start, end, ChronoUnit.MINUTES));  // ====> 分鐘:570362
        System.out.println("秒:" + betweenTwoTime(start, end, ChronoUnit.SECONDS));    // ====> 秒:34221720
        System.out.println("毫秒:" + betweenTwoTime(start, end, ChronoUnit.MILLIS));   // ====> 毫秒:34221720000
        System.out.println("================================== 時間大小 ===================================");
        System.out.println("2019-10-13 11:11:00 < 2020-11-13 13:13:00 = " + isBefore(start, end)); //t1 < t2 = true
        System.out.println("2019-10-13 11:11:00 > 2020-11-13 13:13:00 = " + isAfter(start, end));  //t1 > t2 = true

        System.out.println("================================== 周幾 ===================================");
        LocalDateTime of1 = LocalDateTime.of(2020, 4, 20, 0, 0);
        LocalDateTime of2 = LocalDateTime.of(2020, 4, 21, 0, 0);
        LocalDateTime of3 = LocalDateTime.of(2020, 4, 22, 0, 0);
        LocalDateTime of4 = LocalDateTime.of(2020, 4, 23, 0, 0);
        LocalDateTime of5 = LocalDateTime.of(2020, 4, 24, 0, 0);
        LocalDateTime of6 = LocalDateTime.of(2020, 4, 25, 0, 0);
        LocalDateTime of7 = LocalDateTime.of(2020, 4, 26, 0, 0);
        System.out.println(formatTime(of1, "yyyy-MM-dd") + " 是周 " + week(of1));
        System.out.println(formatTime(of2, "yyyy-MM-dd") + " 是周 " + week(of2));
        System.out.println(formatTime(of3, "yyyy-MM-dd") + " 是周 " + week(of3));
        System.out.println(formatTime(of4, "yyyy-MM-dd") + " 是周 " + week(of4));
        System.out.println(formatTime(of5, "yyyy-MM-dd") + " 是周 " + week(of5));
        System.out.println(formatTime(of6, "yyyy-MM-dd") + " 是周 " + week(of6));
        System.out.println(formatTime(of7, "yyyy-MM-dd") + " 是周 " + week(of7));
        System.out.println("=========================== 周開頭和結束 ===============================");
        System.out.println(" 上週的週一是 " + weekFirst(-1));
        System.out.println(" 上週的週末是 " + weekLast(-1));
        System.out.println(" 本週的週一是 " + weekFirst(0));
        System.out.println(" 本週的週末是 " + weekLast(0));
        System.out.println(" 下週的週一是 " + weekFirst(1));
        System.out.println(" 下週的週末是 " + weekLast(1));
        System.out.println("=========================== 月開頭和結束 ===============================");
        System.out.println(" 上月的月初是 " + monthFirst(-1));
        System.out.println(" 上月的月位是 " + monthLast(-1));
        System.out.println(" 本月的月初是 " + monthFirst(0));
        System.out.println(" 本月的月位是 " + monthLast(0));
        System.out.println(" 下月的月初是 " + monthFirst(1));
        System.out.println(" 下月的月位是 " + monthLast(1));
        System.out.println("==================== 當前月1好到下N月底的每天數據 ===============================");
        System.out.println(" 當前月初好到下N月底 " + LocalDateTimeUtil.getDateDaysUpList(2).toString());
    }
}

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