Java Date LocalDate LocalDateTime
Java中常用时间类型 Date LocalDate LocalDateTime 在工作中使用很频繁,
但中间很多常用功能每次编写代码很繁琐,故而封装了以下三个工具类:
- DateUtil 日期工具类
- LocalDateUtil 新日期工具类
- LocalDateTimeUtil 新日期工具类
用于日常使用。
Date 工具类
package cn.lihaozhe.util.date;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.temporal.TemporalAdjusters;
import java.util.Date;
import java.util.List;
import java.util.TimeZone;
import java.util.concurrent.ThreadLocalRandom;
import java.util.stream.Collectors;/*** 日期工具类** @author 李昊哲* @version 1.0*/
public class DateUtil {/*** 默认时区*/private final static String timeZone = "Asia/Shanghai";/*** 默认时区为东 8 区*/private final static ZoneOffset zoneOffset = ZoneOffset.of("+8");/*** 默认时间字符串模板*/private final static String pattern = "yyyy-MM-dd HH:mm:ss";/*** 获取当前系统日期** @return 当前系统日期*/public static Date date() {return new Date();}/*** 获取当前系统日期日期字符串** @return 当前系统日期字符串*/public static String now() {return format(new Date());}/*** 获取当前系统日期日期字符串** @param pattern 日期格式化字符串模板* @return 当前系统日期字符串*/public static String now(String pattern) {return format(new Date(), pattern);}/*** 日期对象格式化为字符串** @param date Date对象* @return Date对象格式化后的日期字符串*/public static String format(Date date) {return format(date, pattern);}/*** 日期对象格式化为字符串** @param date Date对象* @param pattern 日期格式化字符串模板* @return Date对象格式化后的日期字符串*/public static String format(Date date, String pattern) {if (date == null) {return null;}SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);return dateFormat.format(date);}/*** 日期对象格式化为字符串** @param date Date对象* @param pattern 日期格式化字符串模板* @param timeZone 时区* @return Date对象格式化后的日期字符串*/public static String format(Date date, String pattern, String timeZone) {SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));return dateFormat.format(date);}/*** 获取根据时间毫秒数获取日期** @param time 时间毫秒数* @return 日期*/public static Date parse(long time) {return new Date(time);}/*** 将日期字符串解析为日期对象** @param src 日期字符串* @return 日期字符串解析后日期对象* @throws ParseException 日期解析异常*/public static Date parse(String src) throws ParseException {return parse(src, pattern);}/*** 将日期字符串解析为日期对象** @param src 日期字符串* @param pattern 日期格式化字符串模板* @return 日期字符串解析后日期对象* @throws ParseException 日期解析异常*/public static Date parse(String src, String pattern) throws ParseException {return new SimpleDateFormat(pattern).parse(src);}/*** 将日期字符串解析为日期对象** @param src 日期字符串* @param pattern 日期格式化字符串模板* @param timeZone 时区* @return 日期字符串解析后日期对象* @throws ParseException 日期解析异常*/public static Date parse(String src, String pattern, String timeZone) throws ParseException {SimpleDateFormat dateFormat = new SimpleDateFormat(pattern);dateFormat.setTimeZone(TimeZone.getTimeZone(timeZone));return dateFormat.parse(src);}/*** 获取系统当前日期时间毫秒数** @return 当前时间毫秒数*/public static long getTime() {return getTime(new Date());}/*** 获取日期时间毫秒数** @param date 日期* @return 时间毫秒数*/public static long getTime(Date date) {return date.getTime();}/*** 时间补零占位** @param time 时间* @return 补零后的字符串*/public static String zeroCompensation(int time) {if (time < 10) {return "0" + time;}return String.valueOf(time);}/*** 生成范围的随机时间,位于[start,end)范围内 时间倒序排列** @param start 开始时间格式字符串* @param end 结束时间格式字符串* @param count 生成时间数量* @return 随机时间的集合*/public static List<Date> random(String start, String end, int count) throws ParseException {return random(parse(start), parse(end), count);}/*** 生成范围的随机时间,位于[start,end)范围内 时间倒序排列** @param start 开始时间* @param end 结束时间* @param count 生成时间数量* @return 随机时间的集合*/public static List<Date> random(Date start, Date end, int count) {return ThreadLocalRandom.current().longs(count, start.getTime(), end.getTime()).mapToObj(Date::new).sorted(Date::compareTo).collect(Collectors.toList());}/*** 生成范围的随机时间,位于[start,end)范围内 时间倒序排列** @param start 开始时间* @param end 结束时间* @param count 生成时间数量* @return 随机时间的集合*/public static List<LocalDate> random(LocalDate start, LocalDate end, int count) {List<Date> dateList = ThreadLocalRandom.current().longs(count, LocalDateUtils.getMilliSeconds(start), LocalDateUtils.getMilliSeconds(end)).mapToObj(Date::new).sorted(Date::compareTo).toList();return dateList.stream().map(DateUtils::toLocalDate).collect(Collectors.toList());}/*** 生成范围的随机时间,位于[start,end)范围内 时间倒序排列** @param start 开始时间* @param end 结束时间* @param count 生成时间数量* @return 随机时间的集合*/public static List<LocalDateTime> random(LocalDateTime start, LocalDateTime end, int count) {List<Date> dateList = ThreadLocalRandom.current().longs(count, LocalDateTimeUtils.getTime(start), LocalDateTimeUtils.getTime(end)).mapToObj(Date::new).sorted(Date::compareTo).toList();return dateList.stream().map(DateUtils::toLocalDateTime).collect(Collectors.toList());}/*** LocalDate 转 Date** @param localDate LocalDate对象* @return Date对象*/private static Date from(LocalDate localDate) {return from(localDate, zoneOffset);}/*** LocalDate 转 Date** @param localDate LocalDate对象* @param zoneId zoneId* @return Date对象*/private static Date from(LocalDate localDate, String zoneId) {return from(localDate, ZoneOffset.of(zoneId));}/*** LocalDate 转 Date** @param localDate LocalDate对象* @param zoneOffset 时区* @return Date对象*/private static Date from(LocalDate localDate, ZoneOffset zoneOffset) {return Date.from(localDate.atStartOfDay(zoneOffset).toInstant());}/*** LocalDateTime 转 Date** @param localDateTime LocalDateTime对象* @return Date对象*/private static Date from(LocalDateTime localDateTime) {return from(localDateTime, zoneOffset);}/*** LocalDateTime 转 Date** @param localDateTime LocalDateTime* @param zoneId zoneId* @return Date对象*/private static Date from(LocalDateTime localDateTime, String zoneId) {return from(localDateTime, ZoneOffset.of(zoneId));}/*** LocalDateTime 转 Date** @param localDateTime LocalDateTime对象* @param zoneOffset 时区* @return Date对象*/private static Date from(LocalDateTime localDateTime, ZoneOffset zoneOffset) {return Date.from(localDateTime.toInstant(zoneOffset));}/*** Date 转 LocalDate** @param date Date对象* @return LocalDateTime对象*/public static LocalDate toLocalDate(Date date) {return toLocalDate(date, zoneOffset);}/*** Date 转 LocalDate** @param date Date对象* @param zoneId 时区ID* @return LocalDateTime对象*/public static LocalDate toLocalDate(Date date, String zoneId) {return toLocalDate(date, ZoneOffset.of(zoneId));}/*** Date 转 LocalDate** @param date Date对象* @param zoneOffset 时区* @return LocalDate对象*/public static LocalDate toLocalDate(Date date, ZoneOffset zoneOffset) {return date.toInstant().atOffset(zoneOffset).toLocalDate();}/*** Date 转 LocalDate** @param date Date对象* @return Date对象*/public static LocalDateTime toLocalDateTime(Date date) {return toLocalDateTime(date, zoneOffset);}/*** Date 转 LocalDate** @param date Date对象* @param zoneId 时区ID* @return LocalDateTime对象*/public static LocalDateTime toLocalDateTime(Date date, String zoneId) {return toLocalDateTime(date, ZoneOffset.of(zoneId));}/*** Date 转 LocalDateTime** @param date Date对象* @param zoneOffset 时区* @return LocalDateTime对象*/public static LocalDateTime toLocalDateTime(Date date, ZoneOffset zoneOffset) {return date.toInstant().atOffset(zoneOffset).toLocalDateTime();}/*** 获取某日期所在年份的第一天的日期** @param date 日期* @return 所在年份的第一天的日期* @throws ParseException ParseException*/public static Date firstDateOfYear(Date date) throws ParseException {return parse(format(date, "yyyy"), "yyyy");}/*** 获取某日期所在年份的最后一天的日期** @param date 日期* @return 所在年份的最后一天的日期* @throws ParseException ParseException*/public static Date lastDateOfYear(Date date) throws ParseException {return parse(format(date, "yyyy") + "-12-31 23:59:59", pattern);}/*** 获取某日期所在月份的第一天的日期** @param date 日期* @return 所在月份的第一天的日期* @throws ParseException ParseException*/public static Date firstDateOfMonth(Date date) throws ParseException {return parse(format(date, "yyyy-MM") + "-01", "yyyy-MM-dd");}/*** 获取某日期所在月份的最后一天的日期** @param date 日期* @return 所在月份的最后一天的日期* @throws ParseException ParseException*/public static Date lastDateOfMonth(Date date) throws ParseException {return from(toLocalDateTime(date).with(TemporalAdjusters.lastDayOfMonth()));}
}
LocalDate 工具类
package cn.lihaozhe.util.date;import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;/*** LocalDate 工具类** @author 李昊哲* @version 1.0*/
public class LocalDateUtil {/*** 日期格式化模板字符串*/private static final String formatter = "yyyy-MM-dd";/*** 默认时区为东 8 区*/private final static ZoneOffset zoneOffset = ZoneOffset.of("+8");/*** 将LocalDate格式化为默认的日期格式字符串 例如:1983-11-22** @param localDate 欲被格式化的日期* @return 根据日期格式字符串模板格式化的时间字符串*/public static String format(LocalDate localDate) {return format(localDate, formatter);}/*** 将LocalDate格式化为指定的日期格式字符串** @param localDate 欲被格式化的日期* @param formatter 日期字符串模板* @return 根据日期格式字符串模板格式化的时间字符串*/public static String format(LocalDate localDate, String formatter) {if (localDate == null) {return null;}return DateTimeFormatter.ofPattern(formatter).format(localDate);// return localDate.format(DateTimeFormatter.ofPattern(formatter));}/*** 根据默认日期字符串模板将日期格式字符串解析为LocalDate* 默认日期字符串模板 yyyy-MM-dd** @param text 日期格式字符串* @return LocalDate*/public static LocalDate parse(String text) {return parse(text, formatter);}/*** 根据日期字符串模板将日期格式字符串解析为LocalDate** @param text 日期格式字符串* @param formatter 日期格式字符串模板* @return LocalDate*/public static LocalDate parse(String text, String formatter) {return LocalDate.parse(text, DateTimeFormatter.ofPattern(formatter));}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @return LocalDate*/public static LocalDate from(Date date) {return from(date, zoneOffset);}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zoneId 时区ID* @return LocalDate*/public static LocalDate from(Date date, String zoneId) {return from(date, ZoneOffset.of(zoneId));}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zone 时区* @return LocalDate*/public static LocalDate from(Date date, ZoneId zone) {return date.toInstant().atZone(zone).toLocalDate();}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zoneOffset 时区* @return LocalDate*/public static LocalDate from(Date date, ZoneOffset zoneOffset) {return date.toInstant().atOffset(zoneOffset).toLocalDate();}/*** LocalDate 转 Date** @param localDate LocalDate对象* @return Date对象*/public static Date toDate(LocalDate localDate) {return toDate(localDate, zoneOffset);}/*** LocalDate 转 Date** @param localDate LocalDate对象* @param zoneId zoneId* @return Date对象*/public static Date toDate(LocalDate localDate, String zoneId) {return toDate(localDate, ZoneOffset.of(zoneId));}/*** LocalDate 转 Date** @param localDate LocalDate对象* @param zoneOffset 时区* @return Date对象*/public static Date toDate(LocalDate localDate, ZoneOffset zoneOffset) {return Date.from(localDate.atStartOfDay(zoneOffset).toInstant());}/*** LocalDateTime 转 LocalDateTime** @param localDate LocalDate对象* @return LocalDateTime对象*/public static LocalDateTime toLocalDateTime(LocalDate localDate) {return toLocalDateTime(localDate, zoneOffset);}/*** LocalDateTime 转 LocalDateTime** @param localDate LocalDate对象* @param zoneId 时区ID* @return LocalDateTime对象*/public static LocalDateTime toLocalDateTime(LocalDate localDate, String zoneId) {return toLocalDateTime(localDate, ZoneOffset.of(zoneId));}/*** LocalDateTime 转 LocalDateTime** @param localDate LocalDate对象* @param zoneOffset 时区* @return LocalDateTime对象*/public static LocalDateTime toLocalDateTime(LocalDate localDate, ZoneOffset zoneOffset) {return localDate.atStartOfDay(zoneOffset).toLocalDateTime();}/*** 获取时间毫秒数** @return 时间毫秒数*/public static long getMilliSeconds() {return getMilliSeconds(LocalDate.now());}/*** 获取时间毫秒数** @param localDate LocalDate对象* @return 时间毫秒数*/public static long getMilliSeconds(LocalDate localDate) {return getMilliSeconds(localDate, zoneOffset);}/*** 获取时间毫秒数** @param localDate LocalDate对象* @param zoneId 时区ID* @return 时间毫秒数*/public static long getMilliSeconds(LocalDate localDate, String zoneId) {return getMilliSeconds(localDate, ZoneOffset.of(zoneId));}/*** 获取时间毫秒数** @param localDate LocalDate对象* @param zoneOffset 时区* @return 时间毫秒数*/public static long getMilliSeconds(LocalDate localDate, ZoneOffset zoneOffset) {return toLocalDateTime(localDate, zoneOffset).toInstant(zoneOffset).toEpochMilli();}/*** 时间毫秒数转LocalDate 使用系统默认时区** @param milliSeconds 时间毫秒数* @return LocalDate*/public static LocalDate parseMilliSeconds(Long milliSeconds) {return parseMilliSeconds(milliSeconds, ZoneId.systemDefault());}/*** 时间毫秒数转LocalDate** @param milliSeconds 时间毫秒数* @param zoneId 时区* @return LocalDate*/public static LocalDate parseMilliSeconds(Long milliSeconds, ZoneId zoneId) {return Instant.ofEpochMilli(milliSeconds).atZone(zoneId).toLocalDate();}/*** 随机生成 LocalDate 集合** @param start 开始日期字符串 日期字符串格式 yyyy-MM-dd* @param end 结束日期字符串 日期字符串格式 yyyy-MM-dd* @param count 随机数量* @return LocalDate LocalDate集合*/public static List<LocalDate> random(String start, String end, int count) {return random(start, end, count, formatter);}/*** 随机生成 LocalDate 集合** @param start 开始日期字符串* @param end 结束日期字符串* @param count 随机数量* @param formatter 日期字符串模板* @return LocalDate LocalDate集合*/public static List<LocalDate> random(String start, String end, int count, String formatter) {return random(parse(start, formatter), parse(end, formatter), count);}/*** 随机生成 LocalDate 集合** @param start 开始日期* @param end 结束日期* @param count 随机数量* @return LocalDate LocalDate集合*/public static List<LocalDate> random(LocalDate start, LocalDate end, int count) {List<LocalDate> list = new ArrayList<>();for (int i = 0; i < count; i++) {list.add(parseMilliSeconds(ThreadLocalRandom.current().nextLong(getMilliSeconds(start), getMilliSeconds(end))));}if (!list.isEmpty()) {list.sort(LocalDate::compareTo);}return list;}
}
LocalDateTime 工具类
package cn.lihaozhe.util.date;import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;/*** LocalDateTime 工具类** @author 李昊哲* @version 1.0* @create 2023-10-18*/
public class LocalDateTimeUtil {/*** 时间格式化模板字符串*/private static final String formatter = "yyyy-MM-dd HH:mm:ss";/*** 默认时区为东 8 区*/private static final ZoneOffset zoneOffset = ZoneOffset.of("+8");/*** 将LocalDateTime格式化为时间指定的时间格式字符串** @param localDateTime 欲被格式化的时间* @return 根据时间格式字符串模板格式化的时间字符串*/public static String format(LocalDateTime localDateTime) {return format(localDateTime, formatter);}/*** 将LocalDateTime格式化为时间指定的时间格式字符串** @param localDateTime 欲被格式化的时间* @param formatter 时间字符串模板* @return 根据时间格式字符串模板格式化的时间字符串*/public static String format(LocalDateTime localDateTime, String formatter) {if (localDateTime == null) {return null;}return DateTimeFormatter.ofPattern(formatter).format(localDateTime);// return localDateTime.format(DateTimeFormatter.ofPattern(formatter));}/*** 根据时间字符串模板将时间格式字符串解析为LocalDateTime** @param text 时间字符串* @return LocalDateTime*/public static LocalDateTime parse(String text) {return parse(text, formatter);}/*** 根据时间字符串模板将时间格式字符串解析为LocalDateTime** @param text 时间字符串* @param formatter 时间字符串模板* @return LocalDateTime*/public static LocalDateTime parse(String text, String formatter) {return LocalDateTime.parse(text, DateTimeFormatter.ofPattern(formatter));}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @return LocalDate*/public static LocalDateTime from(Date date) {return from(date, zoneOffset);}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zoneId 时区ID* @return LocalDate*/public static LocalDateTime from(Date date, String zoneId) {return from(date, ZoneOffset.of(zoneId));}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zone 时区* @return LocalDate*/public static LocalDateTime from(Date date, ZoneId zone) {return date.toInstant().atZone(zone).toLocalDateTime();}/*** Date类型的时间转为LocalDateTime类型的时间** @param date Date* @param zoneOffset 时区* @return LocalDateTime*/public static LocalDateTime from(Date date, ZoneOffset zoneOffset) {return date.toInstant().atOffset(zoneOffset).toLocalDateTime();}/*** LocalDate 转 Date** @param localDateTime LocalDateTime对象* @return Date对象*/public static Date toDate(LocalDateTime localDateTime) {return toDate(localDateTime, zoneOffset);}/*** LocalDate 转 Date** @param localDateTime LocalDateTime对象* @param zoneId zoneId* @return Date对象*/public static Date toDate(LocalDateTime localDateTime, String zoneId) {return toDate(localDateTime, ZoneOffset.of(zoneId));}/*** LocalDate 转 Date** @param localDateTime LocalDateTime对象* @param zoneOffset 时区* @return Date对象*/public static Date toDate(LocalDateTime localDateTime, ZoneOffset zoneOffset) {return Date.from(localDateTime.toInstant(zoneOffset));}/*** 获取当前时间毫秒数** @return 当前时间毫秒数*/public static long getTime() {return LocalDateTime.now(ZoneOffset.of("+8")).toInstant(ZoneOffset.of("+8")).toEpochMilli();}/*** 获取时间毫秒数** @param localDateTime 日期时间* @return 当前时间毫秒数*/public static long getTime(LocalDateTime localDateTime) {return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli();}/*** 时间毫秒数转LocalDateTime** @param milliseconds 时间毫秒数* @return LocalDateTime*/public static LocalDateTime parseMilliSeconds(Long milliseconds) {return LocalDateTime.ofInstant(Instant.ofEpochMilli(milliseconds), ZoneId.systemDefault());}/*** 时间毫秒数转LocalDateTime** @param milliseconds 时间毫秒数* @param zoneId ZoneId* @return LocalDateTime*/public static LocalDateTime parseMilliSeconds(Long milliseconds, ZoneId zoneId) {return LocalDateTime.ofInstant(Instant.ofEpochMilli(milliseconds), zoneId);}/*** 随机生成 LocalDate 集合** @param start 开始时间字符串 时间字符串格式 yyyy-MM-dd HH:mm:ss* @param end 结束时间字符串 时间字符串格式 yyyy-MM-dd HH:mm:ss* @param count 随机数量* @return LocalDateTime 集合*/public static List<LocalDateTime> random(String start, String end, int count) {return random(start, end, count, formatter);}/*** 随机生成 LocalDateTime 集合** @param start 开始时间字符串* @param end 结束时间字符串* @param count 随机数量* @param formatter 时间字符串模板* @return LocalDateTime LocalDateTime集合*/public static List<LocalDateTime> random(String start, String end, int count, String formatter) {return random(parse(start, formatter), parse(end, formatter), count);}/*** 随机生成 LocalDateTime 集合** @param start 开始时间* @param end 结束时间* @param count 随机数量* @return LocalDateTime 集合*/public static List<LocalDateTime> random(LocalDateTime start, LocalDateTime end, int count) {List<LocalDateTime> list = new ArrayList<>();for (int i = 0; i < count; i++) {list.add(parseMilliSeconds(ThreadLocalRandom.current().nextLong(getTime(start), getTime(end))));}if (!list.isEmpty()) {list.sort(LocalDateTime::compareTo);}return list;}
}