1. 仅比较:月-日
public static boolean isTimeBetween(String startTime, String endTime, LocalDateTime time) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
LocalDate timeDate = time.toLocalDate();
LocalDate startDate;
LocalDate endDate;
try {
TemporalAccessor startTemporal = formatter.parse(startTime);
startDate = LocalDate.of(time.getYear(),
startTemporal.get(ChronoField.MONTH_OF_YEAR),
startTemporal.get(ChronoField.DAY_OF_MONTH));
TemporalAccessor endTemporal = formatter.parse(endTime);
endDate = LocalDate.of(time.getYear(),
endTemporal.get(ChronoField.MONTH_OF_YEAR),
endTemporal.get(ChronoField.DAY_OF_MONTH));
if (endDate.isBefore(startDate)) {
endDate = endDate.plusYears(1);
}
} catch (Exception e) {
System.err.println("解析日期时发生错误: " + e.getMessage());
return false;
}
return !timeDate.isBefore(startDate) && !timeDate.isAfter(endDate);
}
2. 仅比较:时-分(HH:mm)
public static boolean isTimeBetweenOfHHmm(String startTime, String endTime, LocalDateTime time) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
try {
startTime = startTime.length() == 4 ? "0" + startTime : startTime;
endTime = endTime.length() == 4 ? "0" + endTime : endTime;
TemporalAccessor startTemporal = formatter.parse(startTime);
LocalDateTime startDate = LocalDateTime.of(time.getYear(), time.getMonthValue(), time.getDayOfMonth(),
startTemporal.get(ChronoField.HOUR_OF_DAY), startTemporal.get(ChronoField.MINUTE_OF_HOUR));
TemporalAccessor endTemporal = formatter.parse(endTime);
LocalDateTime endDate = LocalDateTime.of(time.getYear(), time.getMonthValue(), time.getDayOfMonth(),
endTemporal.get(ChronoField.HOUR_OF_DAY), endTemporal.get(ChronoField.MINUTE_OF_HOUR));
if (endTime.equals("24:00")) {
endDate = endDate.plusDays(1).withHour(0).withMinute(0);
}
return !time.isBefore(startDate) && time.isBefore(endDate);
} catch (Exception e) {
System.err.println("解析时间时发生错误: " + e.getMessage());
return false;
}
}
3. 时间先后:LocalDate **
public static boolean isDateBetween(LocalDate startDate, LocalDate endDate, LocalDate date) {
if (startDate == null || endDate == null || date == null) {
return false;
}
if (startDate.isAfter(endDate)) {
System.err.println("起始日期不能在结束日期之后");
return false;
}
return !date.isBefore(startDate) && !date.isAfter(endDate);
}
4. 判断日期是否为周末
public static boolean isWeekend(LocalDateTime time) {
if (time == null) {
throw new IllegalArgumentException("时间不能为空");
}
DayOfWeek dayOfWeek = time.getDayOfWeek();
return dayOfWeek == DayOfWeek.SATURDAY || dayOfWeek == DayOfWeek.SUNDAY;
}
5. 转换-字符串为: LocalDateTime,支持多种常见格式 **
public static LocalDateTime parseDateTime(String dateTimeStr) {
DateTimeFormatter[] formatters = {
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"),
DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm"),
DateTimeFormatter.ofPattern("yyyyMMddHHmmss"),
DateTimeFormatter.ISO_DATE_TIME
};
for (DateTimeFormatter formatter : formatters) {
try {
return LocalDateTime.parse(dateTimeStr, formatter);
} catch (DateTimeParseException e) {
}
}
System.err.println("无法解析日期时间字符串: " + dateTimeStr);
return null;
}
6. 计算两个时间-分钟差
public static long getMinutesBetween(LocalDateTime startTime, LocalDateTime endTime) {
if (startTime == null || endTime == null) {
throw new IllegalArgumentException("起始时间和结束时间不能为空");
}
return ChronoUnit.MINUTES.between(startTime, endTime);
}
7. LocalDateTime-转换为指定格式-字符串 **
public static String formatDateTime(LocalDateTime time, String format) {
if (time == null || format == null || format.isEmpty()) {
throw new IllegalArgumentException("时间和格式不能为空");
}
try {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
return time.format(formatter);
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("无效的日期格式: " + format, e);
}
}
8. 判断:是否为闰年
public static boolean isLeapYear(LocalDateTime time) {
if (time == null) {
throw new IllegalArgumentException("时间不能为空");
}
return time.toLocalDate().isLeapYear();
}
9. 转换:秒数为HH:mm:ss字符串
public static String secondsToHHmmss(long seconds) {
if (seconds < 0) {
throw new IllegalArgumentException("秒数不能为负数");
}
long hours = seconds / 3600;
long minutes = (seconds % 3600) / 60;
long secs = seconds % 60;
return String.format("%02d:%02d:%02d", hours, minutes, secs);
}
10. 计算两个时间-天数差 **
public static long getDaysBetween(LocalDate startDate, LocalDate endDate) {
if (startDate == null || endDate == null) {
throw new IllegalArgumentException("起始日期和结束日期不能为空");
}
return ChronoUnit.DAYS.between(startDate, endDate);
}
11. 计算:日期下一个指定工作日(周一至周五)
public static LocalDate getNextBusinessDay(LocalDate date) {
if (date == null) {
throw new IllegalArgumentException("日期不能为空");
}
LocalDate nextDate = date.plusDays(1);
DayOfWeek dayOfWeek = nextDate.getDayOfWeek();
switch (dayOfWeek) {
case SATURDAY:
nextDate = nextDate.plusDays(2);
break;
case SUNDAY:
nextDate = nextDate.plusDays(1);
break;
default:
break;
}
return nextDate;
}
12. 获取:某天的开始时间(即 00:00:00)**
public static LocalDateTime getStartOfDay(LocalDate date) {
if (date == null) {
throw new IllegalArgumentException("日期不能为空");
}
return date.atStartOfDay();
}
13. 获取:某天的结束时间(即 23:59:59)**
public static LocalDateTime getEndOfDay(LocalDate date) {
if (date == null) {
throw new IllegalArgumentException("日期不能为空");
}
return date.atTime(LocalTime.of(23, 59, 59));
}
14. 计算:两个日期之间的工作日天数(不包括周末)
public static long getBusinessDaysBetween(LocalDate startDate, LocalDate endDate) {
if (startDate == null || endDate == null) {
throw new IllegalArgumentException("起始日期和结束日期不能为空");
}
if (startDate.isAfter(endDate)) {
LocalDate temp = startDate;
startDate = endDate;
endDate = temp;
}
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate);
long businessDays = 0;
for (int i = 0; i <= daysBetween; i++) {
DayOfWeek dayOfWeek = startDate.plusDays(i).getDayOfWeek();
if (dayOfWeek != DayOfWeek.SATURDAY && dayOfWeek != DayOfWeek.SUNDAY) {
businessDays++;
}
}
return businessDays;
}
15. 计算:当前时间-指定日期的 天数 **
public static long daysUntil(LocalDate targetDate) {
if (targetDate == null) {
throw new IllegalArgumentException("目标日期不能为空");
}
LocalDate today = LocalDate.now();
return ChronoUnit.DAYS.between(today, targetDate);
}
16. 计算:两个时间-之间的 小时数
public static long hoursBetween(LocalDateTime startTime, LocalDateTime endTime) {
if (startTime == null || endTime == null) {
throw new IllegalArgumentException("起始时间和结束时间不能为空");
}
return ChronoUnit.HOURS.between(startTime, endTime);
}
17. 判断:日期是否是-月末
public static boolean isLastDayOfMonth(LocalDate date) {
if (date == null) {
throw new IllegalArgumentException("日期不能为空");
}
LocalDate lastDayOfMonth = date.withDayOfMonth(date.lengthOfMonth());
return date.equals(lastDayOfMonth);
}
18. 获取:当前季度的开始和结束日期
public static LocalDate[] getCurrentQuarterDates() {
LocalDate now = LocalDate.now();
int month = now.getMonthValue();
LocalDate startDate;
LocalDate endDate;
if (month <= 3) {
startDate = LocalDate.of(now.getYear(), 1, 1);
endDate = LocalDate.of(now.getYear(), 3, 31);
} else if (month <= 6) {
startDate = LocalDate.of(now.getYear(), 4, 1);
endDate = LocalDate.of(now.getYear(), 6, 30);
} else if (month <= 9) {
startDate = LocalDate.of(now.getYear(), 7, 1);
endDate = LocalDate.of(now.getYear(), 9, 30);
} else {
startDate = LocalDate.of(now.getYear(), 10, 1);
endDate = LocalDate.of(now.getYear(), 12, 31);
}
return new LocalDate[]{startDate, endDate};
}
19. 计算:日期的下一个工作日的日期(跳过节假日、周末)
public static LocalDate getNextBusinessDayWithHolidays(LocalDate date, LocalDate[] holidays) {
if (date == null || holidays == null) {
throw new IllegalArgumentException("日期和节假日列表不能为空");
}
Set<LocalDate> holidaySet = new HashSet<>();
for (LocalDate holiday : holidays) {
holidaySet.add(holiday);
}
LocalDate nextDate = date.plusDays(1);
while (nextDate.getDayOfWeek() == DayOfWeek.SATURDAY
|| nextDate.getDayOfWeek() == DayOfWeek.SUNDAY
|| holidaySet.contains(nextDate)) {
nextDate = nextDate.plusDays(1);
}
return nextDate;
}
20. LocalDateTime 转换为 LocalDate,只保留年月日部分 **
public static LocalDate toLocalDate(LocalDateTime dateTime) {
if (dateTime == null) {
throw new IllegalArgumentException("LocalDateTime 不能为空");
}
return dateTime.toLocalDate();
}
21. LocalDate 转换为 LocalDateTime,设置时间部分为 00:00:00 **
public static LocalDateTime toStartOfDay(LocalDate date) {
if (date == null) {
throw new IllegalArgumentException("LocalDate 不能为空");
}
return date.atStartOfDay();
}