| | |
| | | package com.sinata.common.utils; |
| | | |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | |
| | | import java.lang.management.ManagementFactory; |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.DayOfWeek; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.LocalTime; |
| | | import java.time.ZoneId; |
| | | import java.time.ZonedDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.time.temporal.TemporalAdjusters; |
| | | import java.util.ArrayList; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * 时间工具类 |
| | |
| | | "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM", |
| | | "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM", |
| | | "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"}; |
| | | private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); |
| | | |
| | | /** |
| | | * 获取当前Date型日期 |
| | |
| | | } |
| | | |
| | | /** |
| | | * 计算小时差 |
| | | * |
| | | * @param endDate |
| | | * @param startTime |
| | | * @return |
| | | */ |
| | | public static long timeDistanceHour(Date endDate, Date startTime) { |
| | | long nd = 1000 * 24 * 60 * 60; |
| | | long nh = 1000 * 60 * 60; |
| | | long diff = endDate.getTime() - startTime.getTime(); |
| | | long hour = diff % nd / nh; |
| | | return hour; |
| | | } |
| | | |
| | | /** |
| | | * 计算天数差 |
| | | * |
| | | * @param endDate |
| | | * @param startTime |
| | | * @return |
| | | */ |
| | | public static long timeDistanceDay(Date endDate, Date startTime) { |
| | | long nd = 1000 * 24 * 60 * 60; |
| | | long diff = endDate.getTime() - startTime.getTime(); |
| | | long day = diff / nd; |
| | | return day; |
| | | } |
| | | |
| | | /** |
| | | * 增加 LocalDateTime ==> Date |
| | | */ |
| | | public static Date toDate(LocalDateTime temporalAccessor) |
| | |
| | | ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault()); |
| | | return Date.from(zdt.toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * 获取两个时间节点之间的月份列表 |
| | | * |
| | | * @param minDate |
| | | * @param maxDate |
| | | * @param type 1 = 日 2 = 月 3 = 年 |
| | | * @return |
| | | */ |
| | | public static List<String> getDayBetween(Date minDate, Date maxDate, Integer type) { |
| | | List<String> result = new ArrayList<String>(); |
| | | if (type == 3) {//年 |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy");//格式化为年 |
| | | |
| | | Calendar min = Calendar.getInstance(); |
| | | Calendar max = Calendar.getInstance(); |
| | | min.setTime(minDate); |
| | | max.setTime(maxDate); |
| | | |
| | | Calendar curr = min; |
| | | //max.add(Calendar.YEAR, 1); |
| | | while (curr.before(max)) { |
| | | result.add(sdf.format(curr.getTime())); |
| | | curr.add(Calendar.YEAR, 1); |
| | | } |
| | | } else if (type == 2) {//月 |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");//格式化为年月 |
| | | |
| | | Calendar min = Calendar.getInstance(); |
| | | Calendar max = Calendar.getInstance(); |
| | | min.setTime(minDate); |
| | | max.setTime(maxDate); |
| | | |
| | | Calendar curr = min; |
| | | //max.add(Calendar.MONTH, 1); |
| | | while (curr.before(max)) { |
| | | result.add(sdf.format(curr.getTime())); |
| | | curr.add(Calendar.MONTH, 1); |
| | | } |
| | | |
| | | } else {//日 |
| | | SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");//格式化为年月日 |
| | | |
| | | Calendar min = Calendar.getInstance(); |
| | | Calendar max = Calendar.getInstance(); |
| | | min.setTime(minDate); |
| | | max.setTime(maxDate); |
| | | Calendar curr = min; |
| | | //max.add(Calendar.DATE, 1); |
| | | while (curr.before(max)) { |
| | | result.add(sdf.format(curr.getTime())); |
| | | curr.add(Calendar.DATE, 1); |
| | | } |
| | | |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | // 获得本周一0点时间 |
| | | public static Date getTimesWeekmorning() { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); |
| | | cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); |
| | | return cal.getTime(); |
| | | } |
| | | |
| | | // 获得本周日24点时间 |
| | | public static Date getTimesWeeknight() { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(getTimesWeekmorning()); |
| | | cal.add(Calendar.DAY_OF_WEEK, 7); |
| | | return cal.getTime(); |
| | | } |
| | | |
| | | // 获得本月第一天0点时间 |
| | | public static Date getTimesMonthmorning() { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); |
| | | cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH)); |
| | | return cal.getTime(); |
| | | } |
| | | |
| | | // 获得本月最后一天24点时间 |
| | | public static Date getTimesMonthnight() { |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0); |
| | | cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); |
| | | cal.set(Calendar.HOUR_OF_DAY, 24); |
| | | return cal.getTime(); |
| | | } |
| | | |
| | | /** |
| | | * 获取本月所有日期字符串列表 |
| | | * |
| | | * @param format 日期格式,例如 "yyyy-MM-dd" |
| | | * @return 本月所有日期的字符串列表 |
| | | */ |
| | | public static List<String> getAllDatesOfCurrentMonth(String format) { |
| | | // 当前日期 |
| | | LocalDate now = LocalDate.now(); |
| | | // 本月的第一天 |
| | | LocalDate firstDayOfMonth = now.withDayOfMonth(1); |
| | | // 本月的最后一天 |
| | | LocalDate lastDayOfMonth = now.withDayOfMonth(now.lengthOfMonth()); |
| | | |
| | | // 日期格式化器 |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); |
| | | |
| | | // 结果列表 |
| | | List<String> dates = new ArrayList<>(); |
| | | |
| | | // 从第一天开始循环到最后一天 |
| | | LocalDate currentDate = firstDayOfMonth; |
| | | while (!currentDate.isAfter(lastDayOfMonth)) { |
| | | dates.add(currentDate.format(formatter)); // 格式化为字符串并添加到列表 |
| | | currentDate = currentDate.plusDays(1); // 日期加一天 |
| | | } |
| | | |
| | | return dates; |
| | | } |
| | | |
| | | /** |
| | | * 获取本周所有日期字符串列表 |
| | | * |
| | | * @param format 日期格式,例如 "yyyy-MM-dd" |
| | | * @return 本周所有日期的字符串列表 |
| | | */ |
| | | public static List<String> getAllDatesOfCurrentWeek(String format) { |
| | | // 当前日期 |
| | | LocalDate now = LocalDate.now(); |
| | | |
| | | // 本周的星期一(获取当前日期所在周的第一天) |
| | | LocalDate firstDayOfWeek = now.with(TemporalAdjusters.previousOrSame(java.time.DayOfWeek.MONDAY)); |
| | | // 本周的星期日(获取当前日期所在周的最后一天) |
| | | LocalDate lastDayOfWeek = firstDayOfWeek.plusDays(6); |
| | | |
| | | // 日期格式化器 |
| | | DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format); |
| | | |
| | | // 结果列表 |
| | | List<String> dates = new ArrayList<>(); |
| | | |
| | | // 从星期一到星期日循环 |
| | | LocalDate currentDate = firstDayOfWeek; |
| | | while (!currentDate.isAfter(lastDayOfWeek)) { |
| | | dates.add(currentDate.format(formatter)); // 格式化为字符串并添加到列表 |
| | | currentDate = currentDate.plusDays(1); // 日期加一天 |
| | | } |
| | | |
| | | return dates; |
| | | } |
| | | |
| | | /** |
| | | * 获取本月月初第一天0点时间,并返回 Date 类型 |
| | | * |
| | | * @return 本月月初第一天0点时间(Date 类型) |
| | | */ |
| | | public static Date getFirstDayOfCurrentMonthAtMidnight() { |
| | | // 获取当前日期 |
| | | LocalDate now = LocalDate.now(); |
| | | |
| | | // 获取本月的第一天 |
| | | LocalDate firstDayOfMonth = now.withDayOfMonth(1); |
| | | |
| | | // 将第一天与0点时间合并 |
| | | LocalDateTime firstDayAtMidnight = firstDayOfMonth.atTime(LocalTime.MIDNIGHT); |
| | | |
| | | // 将 LocalDateTime 转换为 Date |
| | | return Date.from(firstDayAtMidnight.atZone(ZoneId.systemDefault()).toInstant()); |
| | | } |
| | | |
| | | /** |
| | | * 获取本周初第一天(周一)0点时间,并返回 Date 类型 |
| | | * |
| | | * @return 本周初第一天0点时间(Date 类型) |
| | | */ |
| | | public static Date getFirstDayOfCurrentWeekAtMidnight() { |
| | | // 获取当前日期 |
| | | LocalDate now = LocalDate.now(); |
| | | |
| | | // 获取本周的第一天(星期一) |
| | | LocalDate firstDayOfWeek = now.with(DayOfWeek.MONDAY); |
| | | |
| | | // 将星期一与0点时间合并 |
| | | LocalDateTime firstDayAtMidnight = firstDayOfWeek.atTime(LocalTime.MIDNIGHT); |
| | | |
| | | // 将 LocalDateTime 转换为 Date |
| | | return Date.from(firstDayAtMidnight.atZone(ZoneId.systemDefault()).toInstant()); |
| | | } |
| | | |
| | | } |