超详细的时间工具类,多样化时间类型转换进行操作,列如:String ,Long,Date,LocalDate,LocalDateTime都有相对应的转换
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
import java.time.temporal.TemporalAdjusters;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;
/**
* @program: wym-parent
* @description: 超详细时间工具类
* @author: 尉一民
* @create: 2022-04-02 09:13
**/
public class LocalDateUtils {
/**
* 获取当前日期年/月/日(结束时间)
*
* @param localDateTime 当前时间
* @param chronoUnit 单位:year 年,month 月,day 日
* @return Long 时间戳
* @author: 尉一民
*/
public static Long getEndTime(LocalDateTime localDateTime, ChronoUnit chronoUnit) {
LocalDate localDate = localDateTime.toLocalDate();
LocalDate with = null;
if (ChronoUnit.YEARS.equals(chronoUnit)) {
with = localDate.with(TemporalAdjusters.lastDayOfYear());
}
if (ChronoUnit.MONTHS.equals(chronoUnit)) {
with = localDate.with(TemporalAdjusters.lastDayOfMonth());
}
if (ChronoUnit.DAYS.equals(chronoUnit)) {
return LocalDateTime.of(localDate, LocalTime.MAX)
.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
return with.atStartOfDay(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
}
/**
* 获取当前日期年/月/日(开始时间)
*
* @param localDateTime 当前时间
* @param chronoUnit 单位:year 年,month 月,day 日
* @return Long 时间戳
* @author: 尉一民
*/
public static Long getStartTime(LocalDateTime localDateTime, ChronoUnit chronoUnit) {
LocalDate localDate = localDateTime.toLocalDate();
LocalDate with = null;
if (ChronoUnit.YEARS.equals(chronoUnit)) {
with = localDate.with(TemporalAdjusters.firstDayOfYear());
}
if (ChronoUnit.MONTHS.equals(chronoUnit)) {
with = localDate.with(TemporalAdjusters.firstDayOfMonth());
}
if (ChronoUnit.DAYS.equals(chronoUnit)) {
return LocalDateTime.of(localDate, LocalTime.MIN)
.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
}
return with.atStartOfDay(ZoneId.systemDefault())
.toInstant()
.toEpochMilli();
}
/**
* 从大到小排序 2个日期间的所有日期
*
* @param startDate 开始时间
* @param endDate 结束时间
* @param chronoUnit 年 years 月 month 日 days
* @return List<LocalDate> 获取2个日期之间的所有日期
* @author: 尉一民
*/
public static List<LocalDate> getDescDateList(LocalDate startDate, LocalDate endDate, ChronoUnit chronoUnit) {
List<LocalDate> result = new ArrayList<>();
long dex = chronoUnit.between(startDate, endDate);
if (dex > 0) {
/*以endDate元素开始,日期自减1*/
Stream.iterate(endDate, end -> end.minus(1, chronoUnit))
/*数组长度*/
.limit(dex + 1)
.forEach(date -> result.add(date));
}
return result;
}
/**
* 从小到大排序 2个日期间的所有日期
*
* @param startDate 开始时间
* @param endDate 结束时间
* @param chronoUnit 年 years 月 month 日 days
* @return List<LocalDate> 获取2个日期之间的所有日期
* @author weiyimin
*/
public static List<LocalDate> getAscDateList(LocalDate startDate, LocalDate endDate, ChronoUnit chronoUnit) {
List<LocalDate> result = new ArrayList<>();
/*求2个日期之间的天数差*/
long dex = chronoUnit.between(startDate, endDate);
if (dex > 0) {
/*以startDate元素开始,日期自加1*/
Stream.iterate(startDate, start -> start.plus(1, chronoUnit))
/*数组长度*/
.limit(dex + 1)
.forEach(date -> result.add(date));
}
return result;
}
/**
* 获取几天前开始时间
* 当天开始时间 当天月份天数减1
*
* @param i 几天前
* @param localTime 枚举:Min开始时间,Max结束时间
* @return LocalDateTime
* @author: 尉一民
*/
public static LocalDateTime getBeginDayOfn(int i, LocalTime localTime) {
LocalDate now = LocalDate.now().minusDays(i);
LocalDateTime of = LocalDateTime.of(now, localTime);
return of;
}
/**
* 计算当前日期与{@code endDate}的间隔天数
*
* @param endDate 结束日期
* @return 间隔天数
* @author: 尉一民
*/
public static long localDateCompare(LocalDate endDate) {
return LocalDate.now().until(endDate, ChronoUnit.DAYS);
}
/**
* 计算日期{@code startDate}与{@code endDate}的间隔天数
*
* @param startDate 开始日期
* @param endDate 结束日期
* @return 间隔天数
* @author: 尉一民
*/
public static long localDateCompare(LocalDate startDate, LocalDate endDate) {
return startDate.until(endDate, ChronoUnit.DAYS);
}
/**
* 字符串转换成日期
*
* @param strDate 日期字符串
* @param pattern 日期的格式
* @return LocalDate
* @author: 尉一民
*/
public static LocalDate stringToLocalDate(String strDate, String pattern) {
if (StringUtils.isBlank(strDate)) {
return null;
}
DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern);
return LocalDate.parse(strDate, fmt);
}
/**
* 日期转String
*
* @param time 时间
* @param pattern 时间单位("yyyy-MM-dd HH:mm:ss")
* @return String
* @author: 尉一民
*/
public static String dateTimeToString(LocalDateTime time, String pattern) {
String now = time.format(DateTimeFormatter.ofPattern(pattern));
return now;
}
/**
* Date转LocalDate
*
* @param date
* @author: 尉一民
*/
public static LocalDate dateToLocalDate(Date date) {
if (null == date) {
return null;
}
return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
}
/**
* 当前日期增加{number}
*
* @param number 增加数
* @param chronoUnit 单位:year 年,month 月,day 日
* @return
* @author: 尉一民
*/
public static LocalDate addLocalDate(Long number, ChronoUnit chronoUnit) {
LocalDate plus = LocalDate.now().plus(number, chronoUnit);
return plus;
}
}