import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.TemporalUnit; import java.util.Date; /** * Java8 时间处理 * @author: BuZheng * @date: 2020-01-16 下午 3:25 * */ public class DateTool { /** * locaDate判断两个时间是否相等 * * @param startTime 时间1 * @param endTime 时间2 * @return: boolean * @author: BuZheng **/ public static boolean localDateEquals(LocalDate startTime, LocalDate endTime){ if(startTime.equals(endTime)){ return true; } return false; } /** * locaDateTime判断两个时间是否相等 * * @param startTime 时间1 * @param endTime 时间2 * @return: boolean * @author: BuZheng **/ public static boolean locaDateTimeEquals(LocalDateTime startTime, LocalDateTime endTime){ if(startTime.equals(endTime)){ return true; } return false; } /** * 判断是否是生日 ( Date ) * * @param birthday 生日 * @param referDay 参照时间 * @return: boolean * @author: BuZheng **/ public static boolean isBirthdayByDate(Date birthday, Date referDay){ LocalDate localDateBirthday = date2LocalDate(birthday); LocalDate localDateReferDay = date2LocalDate(referDay); //生日时间 x月x日 MonthDay birthdayTime = MonthDay.of(localDateBirthday.getMonth(), localDateBirthday.getDayOfMonth()); //参照时间 x月x日 MonthDay referMonthDay = MonthDay.from(localDateReferDay); if(birthdayTime.equals(referMonthDay)){ return true; } return false; } /** * 判断是否是生日 ( LocalDate ) * * @param birthday 生日 * @param referDay 参照时间 * @return: boolean * @author: BuZheng **/ public static boolean isBirthdayByLocalDate(LocalDate birthday, LocalDate referDay){ //生日时间 x月x日 MonthDay birthdayTime = MonthDay.of(birthday.getMonth(), birthday.getDayOfMonth()); //参照时间 x月x日 MonthDay referMonthDay = MonthDay.from(referDay); if(birthdayTime.equals(referMonthDay)){ return true; } return false; } /** * 时间转换(LocalDateTime ==》 Date) * @param nowDayStart 当前时间 * @return: java.util.Date * @author: BuZheng **/ public static Date localDateTime2Date(LocalDateTime nowDayStart) { ZoneId zoneId = ZoneId.systemDefault(); ZonedDateTime zdt = nowDayStart.atZone(zoneId); return Date.from(zdt.toInstant()); } /** * 时间转换(LocalDate ==》 Date) * * @param localDate * @return: java.util.Date * @author: BuZheng **/ public static Date localDate2Date(LocalDate localDate) { if(null == localDate) { return null; } ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault()); return Date.from(zonedDateTime.toInstant()); } /** * 时间转换(Date ==》 LocalDateTime) * * @param date 时间 * @return: java.time.LocalDateTime * @author: BuZheng **/ public static LocalDateTime date2LocalDateTime(Date date){ //An instantaneous point on the time-line.(时间线上的一个瞬时点。) Instant instant = date.toInstant(); //A time-zone ID, such as {@code Europe/Paris}.(时区) ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); return localDateTime; } /** * 时间转换(Date ==》 LocalDate) * * @param date 时间 * @return: java.time.LocalDateTime * @author: BuZheng **/ public static LocalDate date2LocalDate(Date date){ //An instantaneous point on the time-line.(时间线上的一个瞬时点。) Instant instant = date.toInstant(); //A time-zone ID, such as {@code Europe/Paris}.(时区) ZoneId zoneId = ZoneId.systemDefault(); LocalDate localDate = instant.atZone(zoneId).toLocalDate(); return localDate; } /** * 时间增加 * * @param date 开始时间 * @param num 数量 * @param temporalUnit 以什么形式相加( ChronoUnit.WEEKS/DAYS) * @return: java.util.Date * @author: BuZheng **/ public static Date datePlus(Date date, int num, TemporalUnit temporalUnit){ LocalDateTime localDateTime = date2LocalDateTime(date); return localDateTime2Date(localDateTime.plus(num, temporalUnit)); } /** * 时间减少 * * @param date 开始时间 * @param num 数量 * @param temporalUnit 以什么形式减少( ChronoUnit.WEEKS/DAYS) * @return: java.util.Date * @author: BuZheng **/ public static Date dateMinus(Date date, int num, TemporalUnit temporalUnit){ LocalDateTime localDateTime = date2LocalDateTime(date); return localDateTime2Date(localDateTime.minus(num, temporalUnit)); } /** * 获取当前时间戳 * @author: BuZheng */ public static long nowMillis(){ return Clock.systemUTC().millis(); } /** * 获取昨天日期 * @param toDay 日期 * @return: java.util.Date * @author: BuZheng */ public static Date getYesterday(Date toDay){ return localDateTime2Date(date2LocalDateTime(toDay).minusDays(1)); } /** * 判断是否是闰年 * @param time 日期 * @return: boolean * @author: BuZheng **/ public static boolean isLeapYear(Date time){ return date2LocalDate(time).isLeapYear(); } /** * 获取相差的时间(通过Period获取年月日) * * @param startDate * @param endDate * @return: java.time.Period * @author: BuZheng **/ public static Period getDiffer(Date startDate, Date endDate){ return Period.between(date2LocalDate(endDate), date2LocalDate(startDate)); } /** * 字符串转成日期(年-月-日) * 字符串格式必须与需转格式一致! * @param timeStr 日期字符串 * @param pattern 需转换的日期格式 * @return: java.util.Date * @author: BuZheng **/ public static Date string2Date(String timeStr, String pattern){ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); LocalDate parse = LocalDate.parse(timeStr, dateTimeFormatter); return localDate2Date(parse); } /** * 字符串转成日期(年-月-日 时-分-秒) * 字符串格式必须与需转格式一致! * @param timeStr 日期字符串 * @param pattern 需转换的日期格式 * @return: java.util.Date * @author: BuZheng **/ public static Date string2DateTime(String timeStr, String pattern){ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); LocalDateTime parse = LocalDateTime.parse(timeStr, dateTimeFormatter); return localDateTime2Date(parse); } /** * 日期转字符串(年-月-日) * 字符串格式必须与需转格式一致! * * @param date 日期 * @param pattern 需转换的日期格式 * @return: java.lang.String * @author: BuZheng **/ public static String date2String(Date date, String pattern){ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); String format = date2LocalDate(date).format(dateTimeFormatter); return format; } /** * 日期转字符串(年-月-日 时-分-秒) * 字符串格式必须与需转格式一致! * * @param date 日期 * @param pattern 需转换的日期格式 * @return: java.lang.String * @author: BuZheng **/ public static String dateTime2String(Date date, String pattern){ DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(pattern); String format = date2LocalDateTime(date).format(dateTimeFormatter); return format; } /** * 获取传入日期最小时间 * * @param date 日期 * @return: java.util.Date * @author: BuZheng **/ public static Date getDateMin(Date date){ LocalDateTime localDateTime = date2LocalDate(date).atTime(LocalTime.MIN); return localDateTime2Date(localDateTime); } /** * 获取传入日期最大时间 * * @param date 日期 * @return: java.util.Date * @author: BuZheng **/ public static Date getDateMax(Date date){ LocalDateTime localDateTime = date2LocalDate(date).atTime(LocalTime.MAX); return localDateTime2Date(localDateTime); } /** * 时间戳转时间(Date) * * @param time 时间 * @return: java.util.Date * @author: BuZheng **/ public static Date timestamp2Date(String time){ Instant timestamp = Instant.ofEpochMilli(Long.parseLong(time)); ZonedDateTime losAngelesTime = timestamp.atZone(ZoneId.of("Asia/Shanghai")); LocalDateTime localDateTime = losAngelesTime.toLocalDateTime(); return localDateTime2Date(localDateTime); } /** * 两个时间戳相差几天 * * @param startTime 开始时间 * @param endTime 结束时间 * @return: int * @author: BuZheng **/ public static long differDays(Long startTime, Long endTime){ //获取相差时间戳 long abs = Math.abs(endTime - startTime); long days = abs / (3600 * 24 * 1000); return days; } }