import org.assertj.core.util.Lists; import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.*; import java.util.Date; import java.util.List; public class LocalDateTimeUtils { public static final String YEAR_MONTH_DAY = "yyyy-MM-dd"; public static final String DATE_TIME = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_MINUTE_TIME = "yyyy-MM-dd HH:mm"; public static final String DATE_TIME_MILLIS = "yyyy-MM-dd HH:mm:ss.SSS"; public static final String DATE_HOUR_TIME = "yyyy-MM-dd HH"; //获取当前时间前,几个时间单位的整小时时间戳(参数为毫秒值)如:参数为1,结果是当前时间前一毫秒的当前整小时时间戳 public static long getNowMillisPre(Long millis) { Long milliByTime = getMilliByTime(LocalDateTime.now()) - millis; LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(milliByTime / 1000, 0, ZoneOffset.ofHours(8)); String dateTimeStr = formatTime(localDateTime, DATE_HOUR_TIME); DateTimeFormatter df = DateTimeFormatter.ofPattern(DATE_HOUR_TIME); Long dateTime = LocalDateTime.parse(dateTimeStr, df).atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); return dateTime; } //获取当前时间的毫秒值 public static long getNowMillis() { return getMilliByTime(LocalDateTime.now()); } //获取当日凌晨 public static LocalDateTime getWeeHour() { return LocalDateTime.of(LocalDate.now(), LocalTime.of(0, 0, 0)); } //获取本周周一凌晨 public static long getMondayMill() { Date date = new Date(); Instant instant = date.toInstant(); ZoneId zoneId = ZoneId.systemDefault(); LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime(); LocalDateTime monday = localDateTime.with(TemporalAdjusters.previous(DayOfWeek.SUNDAY)).plusDays(1).withHour(0).withMinute(0).withSecond(0); return getMilliByTime(monday); } //获取当日凌晨 秒 public static long getWeeHourSecend() { return getSecondsByTime(getWeeHour()); } public static long getWeeHourSecend(int day) { return getSecondsByTime(getWeeHour().minusDays(day)); } public static long getWeeHourMillis(int day) { return getMilliByTime(getWeeHour().minusDays(day)); } //获取当日凌晨 毫秒 public static long getWeeHourMillis() { return getMilliByTime(getWeeHour()); } //获取几天前的凌晨 public static LocalDateTime getWeeHourAgo(int day) { return getWeeHour().minusDays(day); } //获取几天前的结束时间 public static LocalDateTime getEndAgo(int day) { return getDayEnd(LocalDateTime.now()).minusDays(day); } //获取以当前时间为止,几小时前的整点 秒值 public static long getOClockAgo(int number) { LocalDateTime hoursAgo = minu(LocalDateTime.now(), number, ChronoUnit.HOURS); LocalDateTime oClockAgo = hoursAgo.withMinute(0).withSecond(0).withNano(0); return getSecondsByTime(oClockAgo); } //获取以当前时间为止,几小时前的整点 毫秒值 public static long getOClockAgoMillis(int number) { LocalDateTime hoursAgo = minu(LocalDateTime.now(), number, ChronoUnit.HOURS); LocalDateTime oClockAgo = hoursAgo.withMinute(0).withSecond(0).withNano(0); return getMilliByTime(oClockAgo); } public static long getOClockAgoMillis(int number, LocalDateTime now) { LocalDateTime hoursAgo = minu(now, number, ChronoUnit.HOURS); LocalDateTime oClockAgo = hoursAgo.withMinute(0).withSecond(0).withNano(0); return getMilliByTime(oClockAgo); } //获取以当前时间为止,几分钟前的整分钟 毫秒值 public static long getMinuteStartAgoMillis(int number) { return getMilliByTime(getMinuteStartAgoTime(number)); } public static LocalDateTime getMinuteStartAgoTime(int number) { LocalDateTime minutesAgo = minu(LocalDateTime.now(), number, ChronoUnit.MINUTES); return minutesAgo.withSecond(0).withNano(0); } //获取时间集合。整点小时 @Deprecated public static List<String> getTimeList(int beginNum) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); for (int i = beginNum; i >= 0; i--) { String hour = formatTime(now.minusHours(i), "HH"); list.add(hour + ":00"); } return list; } public static List<String> getTimeList(int number, ChronoUnit field, String format) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); LocalDateTime numberAgo = minu(now, number, field); int total = number; for (int i = 0; i < total; i++) { list.add(formatTime(plus(numberAgo, i, field), format)); } return list; } public static List<String> getTimeList(int number, ChronoUnit field, String format, boolean containNow) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); LocalDateTime numberAgo = minu(now, number, field); int total = number; if (containNow) { total = number + 1; } for (int i = 0; i < total; i++) { list.add(formatTime(plus(numberAgo, i, field), format)); } return list; } public static List<String> getTimeList(LocalDateTime beginTime, ChronoUnit field, String format) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); long diffTwoTime = betweenTwoTime(beginTime, now, field); long total = diffTwoTime; for (long i = 0; i < total; i++) { list.add(formatTime(plus(beginTime, i, field), format)); } return list; } public static List<String> getTimeList(LocalDateTime beginTime, ChronoUnit field, String format, boolean containNow) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); long diffTwoTime = betweenTwoTime(beginTime, now, field); long total = diffTwoTime; if (containNow) { total = diffTwoTime + 1; } for (long i = 0; i < total; i++) { list.add(formatTime(plus(beginTime, i, field), format)); } return list; } public static List<String> getTimeList(ChronoField field, int interval, ChronoUnit fieldUnit, int number, String format) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); int timeNow = now.get(field); int timeToWant = timeNow / interval * interval; LocalDateTime timeBegin = now.with(field, timeToWant).minus(number, fieldUnit); int total = number / interval; for (int i = 0; i < total; i++) { list.add(formatTime(plus(timeBegin, i * interval, fieldUnit), format)); } return list; } public static List<String> getTimeList(ChronoField field, int interval, ChronoUnit fieldUnit, int number, String format, boolean containNow) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); int timeNow = now.get(field); int timeToWant = timeNow / interval * interval; LocalDateTime timeBegin = now.with(field, timeToWant).minus(number, fieldUnit); int total = number / interval; if (containNow) { for (int i = 1; i <= total; i++) { list.add(formatTime(plus(timeBegin, i * interval, fieldUnit), format)); } } else { for (int i = 0; i < total; i++) { list.add(formatTime(plus(timeBegin, i * interval, fieldUnit), format)); } } return list; } @Deprecated public static List<String> getMinuteList(int countOfHour, int interval, String format) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); int minuteNow = now.getMinute(); int minuteToWant = minuteNow / interval * interval; LocalDateTime timeBegin = now.withMinute(minuteToWant).minusHours(countOfHour); int total = countOfHour * 60 / interval; for (int i = 1; i <= total; i++) { String time = formatTime(timeBegin.plusMinutes(i * interval), format); list.add(time); } return list; } public static List<String> getMinuteList(int count, int interval, String format, ChronoUnit field) { List<String> list = Lists.newArrayList(); LocalDateTime now = LocalDateTime.now(); int minuteNow = now.getMinute(); int minuteToWant = minuteNow / interval * interval; LocalDateTime timeBegin = minu(now.withMinute(minuteToWant), count, ChronoUnit.MINUTES); int total = count / interval; for (int i = 1; i <= total; i++) { String time = formatTime(timeBegin.plusMinutes(i * interval), format); list.add(time); } return list; } //获取一天的开始时间,2017,7,22 00:00 public static LocalDateTime getDayStart(LocalDateTime time) { return time.withHour(0).withMinute(0).withSecond(0).withNano(0); } //获取一天的结束时间,2017,7,22 23:59:59.999999999 public static LocalDateTime getDayEnd(LocalDateTime time) { return time.withHour(23).withMinute(59).withSecond(59).withNano(999999999); } //获取当月第一天。 参数可以是LocalDate、LocalDateTime、LocalTime等。 //传不同的参数会得到不同的结果。 public static Temporal getFirstDayOfMonth(Temporal date) { return date.with(TemporalAdjusters.firstDayOfMonth()); } public static Temporal getCopyDateToWant(Temporal date, TemporalAdjuster adjuster) { return date.with(adjuster); } //获取当月第一天的凌晨 public static Long getFirstDayOfCurrentMonth() { LocalDate firstDay = LocalDate.now().with(TemporalAdjusters.firstDayOfMonth()); LocalTime weeHour = LocalTime.of(0, 0, 0); LocalDateTime firstDayOfCurrentMonth = LocalDateTime.of(firstDay, weeHour); return getMilliByTime(firstDayOfCurrentMonth); } //获取当年第一天的凌晨 public static LocalDateTime getDayStartThisYear() { LocalDateTime firstDay = (LocalDateTime) getCopyDateToWant(LocalDateTime.now(), TemporalAdjusters.firstDayOfYear()); LocalDateTime dayStart = getDayStart(firstDay); return dayStart; } //获取两个日期的差 field参数为ChronoUnit.* 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); } //日期加上一个数,根据field不同加不同值,field为ChronoUnit.* public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) { return time.plus(number, field); } //日期减去一个数,根据field不同减不同值,field参数为ChronoUnit.* public static LocalDateTime minu(LocalDateTime time, long number, TemporalUnit field) { return time.minus(number, field); } //获取指定时间的指定格式 public static String formatTime(LocalDateTime time, String pattern) { return time.format(DateTimeFormatter.ofPattern(pattern)); } public static String formatDate(LocalDateTime time) { return time.format(DateTimeFormatter.ofPattern(YEAR_MONTH_DAY)); } public static String formatDateTime(LocalDateTime time) { return time.format(DateTimeFormatter.ofPattern(DATE_TIME)); } //获取当前时间的指定格式 public static String formatNow(String pattern) { return formatTime(LocalDateTime.now(), pattern); } //解析指定格式的时间 public static LocalDateTime parseTime(String time, String pattern) { return LocalDateTime.parse(time, DateTimeFormatter.ofPattern(pattern)); } //获取指定日期的毫秒 public static Long getMilliByTime(LocalDateTime time) { return time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); } //获取指定日期的秒 public static Long getSecondsByTime(LocalDateTime time) { return time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond(); } //Date转换为LocalDateTime public static LocalDateTime convertDateToLDT(Date date) { return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); } //LocalDateTime转换为Date public static Date convertLDTToDate(LocalDateTime time) { return Date.from(time.atZone(ZoneId.systemDefault()).toInstant()); } //判断给定时间是否不在当前这个小时内 public static boolean judgePassedTimeLine(int hourAgo) { LocalDateTime now = LocalDateTime.now(); if (now.getHour() != hourAgo) { return true; } return false; } }