| | |
| | | import java.text.ParseException; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.*; |
| | | import java.util.Date; |
| | | import java.util.HashSet; |
| | | import java.util.Objects; |
| | | import java.util.Set; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.*; |
| | | |
| | | import org.apache.commons.lang3.time.DateFormatUtils; |
| | | import org.springframework.lang.Nullable; |
| | |
| | | private static String isHoliday = "1-1,1-28,1-29,1-30,1-31,2-1,2-2,2-3,2-4," |
| | | +"4-4,4-5,4-6,5-1,5-2,5-3,5-4,5-5,5-31,6-1,6-2,10-1,10-2,10-3," |
| | | +"10-4,10-5,10-6,10-7,10-8"; |
| | | |
| | | // 线程安全的格式化器(全局静态) |
| | | private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
| | | private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm"); |
| | | |
| | | /** |
| | | * 获取两个时间内,除去周末周日以及法定节假日的 小时总数。 |
| | |
| | | LocalDateTime of = LocalDateTime.of(localDateTime.getYear(), localDateTime.getMonth(), localDateTime.getDayOfMonth(), 23, 59, 59); |
| | | return Timestamp.valueOf(of); |
| | | } |
| | | /** |
| | | * 获取指定时间所在月份的开始时间(当月1日 00:00:00) |
| | | * @param date 任意时间(可为null,默认取当前时间) |
| | | * @return 当月开始时间 |
| | | */ |
| | | public static Date getMonthStartTime(Date date) { |
| | | Calendar calendar = Calendar.getInstance(); |
| | | // 若传入时间为null,使用当前时间 |
| | | if (date != null) { |
| | | calendar.setTime(date); |
| | | } |
| | | // 设置为当月1日 |
| | | calendar.set(Calendar.DAY_OF_MONTH, 1); |
| | | // 设置为00:00:00 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 0); |
| | | calendar.set(Calendar.MINUTE, 0); |
| | | calendar.set(Calendar.SECOND, 0); |
| | | calendar.set(Calendar.MILLISECOND, 0); // 毫秒置0,避免时间偏差 |
| | | return calendar.getTime(); |
| | | } |
| | | |
| | | /** |
| | | * 获取指定时间所在月份的结束时间(当月最后一日 23:59:59) |
| | | * @param date 任意时间(可为null,默认取当前时间) |
| | | * @return 当月结束时间 |
| | | */ |
| | | public static Date getMonthEndTime(Date date) { |
| | | Calendar calendar = Calendar.getInstance(); |
| | | if (date != null) { |
| | | calendar.setTime(date); |
| | | } |
| | | // 设置为当月最后一天 |
| | | calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); |
| | | // 设置为23:59:59 |
| | | calendar.set(Calendar.HOUR_OF_DAY, 23); |
| | | calendar.set(Calendar.MINUTE, 59); |
| | | calendar.set(Calendar.SECOND, 59); |
| | | calendar.set(Calendar.MILLISECOND, 999); // 毫秒置999,覆盖所有毫秒数 |
| | | return calendar.getTime(); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 拆分Date为年月日和时分字符串 |
| | | * @param date 待拆分的Date(可为null) |
| | | * @return Map:key=date(年月日)、time(时分),值为对应字符串;null返回空字符串 |
| | | */ |
| | | public static Map<String, String> splitDateToDateAndTime(Date date) { |
| | | Map<String, String> result = new HashMap<>(); |
| | | if (date == null) { |
| | | result.put("date", ""); |
| | | result.put("time", ""); |
| | | return result; |
| | | } |
| | | |
| | | // Date转LocalDateTime(处理时区) |
| | | LocalDateTime localDateTime = LocalDateTime.ofInstant( |
| | | date.toInstant(), |
| | | ZoneId.systemDefault() // 用系统默认时区,避免时差 |
| | | ); |
| | | |
| | | // 拆分年月日和时分 |
| | | String dateStr = DATE_FORMATTER.format(localDateTime); |
| | | String timeStr = TIME_FORMATTER.format(localDateTime); |
| | | |
| | | result.put("date", dateStr); |
| | | result.put("time", timeStr); |
| | | return result; |
| | | } |
| | | } |