基于 Java 1.8,新的日期和时间 API 封装
Don’t say much, just go to the code.
package org.bood.common.utils;
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAdjuster;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
/**
* JAVA 8 时间工具类
*
* @author bood
* @since 2020/9/25
*/
public class DateTimeUtils {
/**
* 格式:yyyy-MM-dd HH:mm:ss
*/
public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
/**
* 格式:yyyy-MM-dd
*/
public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
/**
* 格式:HH:mm:ss
*/
public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");
private DateTimeUtils() {
}
// ------------------------------------------- 获取时间 -------------------------------------------
/**
* 返回 当前时间的(yyyy-MM-dd HH:mm:ss)
*
* @return yyyy-MM-dd HH:mm:ss
*/
public static LocalDateTime get() {
return LocalDateTime.now();
}
/**
* 返回 当前时间的(yyyy-MM-dd)
*
* @return yyyy-MM-dd
*/
public static LocalDate getCurrentLocalDate() {
return LocalDate.now();
}
/**
* 返回 当前时间的(HH:mm:ss)
*
* @return HH:mm:ss
*/
public static LocalTime getCurrentLocalTime() {
return LocalTime.now();
}
// ------------------------------------------- 时间格式化 -------------------------------------------
/**
* <p>
* yyyy-MM-dd HH:mm:ss 转 LocalDateTime 类型
* </p>
*
* @param dateTimeStr: yyyy-MM-dd HH:mm:ss
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime parseLocalDateTime(String dateTimeStr) {
return LocalDateTime.parse(dateTimeStr, DATETIME_FORMATTER);
}
/**
* <p>
* yyyy-MM-dd 转 LocalDate 类型
* </p>
*
* @param dateStr: yyyy-MM-dd
* @return:java.time.LocalDate
* @author:bood
* @date:2020/9/25
*/
public static LocalDate parseLocalDate(String dateStr) {
return LocalDate.parse(dateStr, DATE_FORMATTER);
}
/**
* <p>
* HH:mm:ss 转 LocalTime 类型
* </p>
*
* @param timeStr: HH:mm:ss
* @return:java.time.LocalTime
* @author:bood
* @date:2020/9/25
*/
public static LocalTime parseLocalTime(String timeStr) {
return LocalTime.parse(timeStr, TIME_FORMATTER);
}
/**
* <p>
* LocalDateTime 转 yyyy-MM-dd HH:mm:ss
* </p>
*
* @param datetime: LocalDateTime
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String formatLocalDateTime(LocalDateTime datetime) {
return datetime.format(DATETIME_FORMATTER);
}
/**
* <p>
* LocalDate 转 yyyy-MM-dd
* </p>
*
* @param date: LocalDate
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String formatLocalDate(LocalDate date) {
return date.format(DATE_FORMATTER);
}
/**
* <p>
* LocalTime 转 HH:mm:ss
* </p>
*
* @param time: LocalTime
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String formatLocalTime(LocalTime time) {
return time.format(TIME_FORMATTER);
}
// ------------------------------------------- 时间计算 -------------------------------------------
/**
* <p>
* 当前时间延期几天
* </p>
*
* @param days: 天数
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime plusDays(int days) {
return get().plusDays(days);
}
/**
* <p>
* 日期相隔天数
* </p>
*
* @param startDateInclusive: 开始时间
* @param endDateExclusive: 结束时间
* @return:int
* @author:bood
* @date:2020/9/25
*/
public static int periodDays(LocalDate startDateInclusive, LocalDate endDateExclusive) {
return Period.between(startDateInclusive, endDateExclusive).getDays();
}
/**
* <p>
* 日期相隔小时
* </p>
*
* @param startInclusive: 开始时间
* @param endExclusive: 结束时间
* @return:long
* @author:bood
* @date:2020/9/25
*/
public static long durationHours(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toHours();
}
/**
* <p>
* 日期相隔分钟
* </p>
*
* @param startInclusive: 开始时间
* @param endExclusive: 结束时间
* @return:long
* @author:bood
* @date:2020/9/25
*/
public static long durationMinutes(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toMinutes();
}
/**
* <p>
* 日期相隔毫秒数
* </p>
*
* @param startInclusive: 开始时间
* @param endExclusive: 结束时间
* @return:long
* @author:bood
* @date:2020/9/25
*/
public static long durationMillis(Temporal startInclusive, Temporal endExclusive) {
return Duration.between(startInclusive, endExclusive).toMillis();
}
/**
* <p>
* 返回 指定年份的(yyyy-MM-dd HH:mm:ss)
* </p>
*
* @param year: 年份
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime withYear(int year) {
return get().withYear(year);
}
/**
* <p>
* 返回 指定年份的 第一天时间
* </p>
*
* @param year: 年份
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime firstDayOfThisYear(int year) {
return withYear(year).with(TemporalAdjusters.firstDayOfYear()).with(LocalTime.MIN);
}
/**
* <p>
* 返回 指定年份的 最末天时间
* </p>
*
* @param year: 年份
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime lastDayOfThisYear(int year) {
return withYear(year).with(TemporalAdjusters.lastDayOfYear()).with(LocalTime.MAX);
}
/**
* <p>
* 返回 指定年份的 第一天时间
* </p>
*
* @param year: 年份
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getFirstDayOfThisDate(int year) {
LocalDateTime firstDayOfThisYear = firstDayOfThisYear(year);
return DATETIME_FORMATTER.format(firstDayOfThisYear);
}
/**
* <p>
* 返回 指定年份的 最末天时间
* </p>
*
* @param year: 年份
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getLastDayOfThisDate(int year) {
LocalDateTime lastDayOfThisYear = lastDayOfThisYear(year);
return DATETIME_FORMATTER.format(lastDayOfThisYear);
}
/**
* <p>
* 获取本月的第一天(当前时间)
* </p>
*
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getFirstDayOfThisMonth() {
LocalDateTime firstDayOfThisYear = get().with(TemporalAdjusters.firstDayOfMonth());
return DATETIME_FORMATTER.format(firstDayOfThisYear);
}
/**
* <p>
* 获取本月的最末天(当前时间)
* </p>
*
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getLastDayOfThisMonth() {
LocalDateTime firstDayOfThisYear = get().with(TemporalAdjusters.lastDayOfMonth());
return DATETIME_FORMATTER.format(firstDayOfThisYear);
}
/**
* <p>
* 当天开始时间
* </p>
*
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime todayStart() {
return LocalDateTime.of(getCurrentLocalDate(), LocalTime.MIN);
}
/**
* <p>
* 当天结束时间
* </p>
*
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime todayEnd() {
return LocalDateTime.of(getCurrentLocalDate(), LocalTime.MAX);
}
/**
* <p>
* 获取 指定年月的 第一个周一
* </p>
*
* @param year: 年份
* @param month: 月份
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime firstDayOfWeekInYearMonth(int year, int month) {
return get().withYear(year).withMonth(month).with(TemporalAdjusters.firstInMonth(DayOfWeek.MONDAY));
}
/**
* <p>
* 获取 本周 第一天
* </p>
*
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getStartDayOfWeekToString() {
return formatLocalDate(getStartDayOfWeek());
}
/**
* <p>
* 获取 本周 第一天
* </p>
*
* @return:java.time.LocalDate
* @author:bood
* @date:2020/9/25
*/
public static LocalDate getStartDayOfWeek() {
TemporalAdjuster first_of_week = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.minusDays(localDate
.getDayOfWeek().getValue() - DayOfWeek.MONDAY.getValue()));
return getCurrentLocalDate().with(first_of_week);
}
/**
* <p>
* 获取 本周 第末天
* </p>
*
* @return:java.lang.String
* @author:bood
* @date:2020/9/25
*/
public static String getEndDayOfWeekToString() {
return formatLocalDate(getEndDayOfWeek());
}
/**
* <p>
* 获取 本周 第末天
* </p>
*
* @return:java.time.LocalDate
* @author:bood
* @date:2020/9/25
*/
public static LocalDate getEndDayOfWeek() {
TemporalAdjuster last_of_week = TemporalAdjusters.ofDateAdjuster(localDate -> localDate.plusDays(
DayOfWeek.SUNDAY.getValue() - localDate.getDayOfWeek().getValue()));
return getCurrentLocalDate().with(last_of_week);
}
/**
* <p>
* LocalDateTime 转 Date
* </p>
*
* @param localDateTime: LocalDate 类型
* @return:java.util.Date
* @author:bood
* @date:2020/9/25
*/
public static Date asDate(LocalDateTime localDateTime) {
return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
}
/**
* <p>
* Date 转 LocalDateTime
* </p>
*
* @param date: Date 类型
* @return:java.time.LocalDateTime
* @author:bood
* @date:2020/9/25
*/
public static LocalDateTime asLocalDateTime(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDateTime();
}
/**
* <p>
* LocalDate 转 Date
* </p>
*
* @param localDate: LocalDate 类型
* @return:java.util.Date
* @author:bood
* @date:2020/9/25
*/
public static Date asDate(LocalDate localDate) {
return Date.from(localDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant());
}
/**
* <p>
* Date 转 LocalDate
* </p>
*
* @param date: Date 类型
* @return:java.time.LocalDate
* @author:bood
* @date:2020/9/25
*/
public static LocalDate asLocalDate(Date date) {
return Instant.ofEpochMilli(date.getTime()).atZone(ZoneId.systemDefault()).toLocalDate();
}
}