一、工具類 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());
}
}