package com.tuya;
import org.apache.commons.lang3.StringUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
public class LocalDateUtils {
public static final String PATTEN_DATE_SPLIT = "yyyy-MM-dd";
public static final String PATTEN_DATE = "yyyyMMdd";
static class DateException extends RuntimeException {
public DateException(String message) {
super(message);
}
public DateException(String message, Throwable cause) {
super(message, cause);
}
}
public static LocalDate parseLocalDate(String specifiedDate, String pattern) {
if (StringUtils.isBlank(specifiedDate)) {
throw new DateException("The date cannot be empty");
}
try {
return LocalDate.parse(specifiedDate, getDateTimeFormatter(pattern));
} catch (Exception e) {
throw new DateException("The date is illegal");
}
}
private static DateTimeFormatter getDateTimeFormatter(String pattern) {
pattern = StringUtils.isNotBlank(pattern) ? pattern : PATTEN_DATE_SPLIT;
return DateTimeFormatter.ofPattern(pattern);
}
public static boolean judgeTimeDifferenceLessThanNYears(String startDate, String endDate, String pattern, int numberOfYears) {
return judgeChronDiffLessThan(startDate, endDate, pattern, ChronoUnit.YEARS, numberOfYears);
}
public static boolean judgeDaysDiffLessThanNDays(String startDate, String endDate, String pattern, int numberOfDays) {
return judgeChronDiffLessThan(startDate, endDate, pattern, ChronoUnit.DAYS, numberOfDays);
}
public static boolean judgeWeeksDiffLessThanNWeeks(String startDate, String endDate, String pattern, int numberOfDays) {
return judgeChronDiffLessThan(startDate, endDate, pattern, ChronoUnit.WEEKS, numberOfDays);
}
public static boolean judgeChronDiffLessThan(String startDate, String endDate, String pattern, ChronoUnit unit, int numberOfUnit) {
LocalDate startLocalDate = parseLocalDate(startDate, pattern);
LocalDate endLocalDate = parseLocalDate(endDate, pattern);
if (!(startLocalDate.isBefore(endLocalDate) || startLocalDate.isEqual(endLocalDate))) {
throw new DateException("The start date must be earlier than or equal to the end date");
}
LocalDate newDate = startLocalDate.plus(numberOfUnit, unit);
if (newDate.isAfter(endLocalDate)) {
return true;
}
return false;
}
public static void main(String[] args) {
testDiffYears();
testDiffDays();
testDiffWeeks();
}
private static void testDiffYears() {
String startDate = "2021-01-01";
String endDate = "2022-01-01";
int numberOfYears = 1;
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s年内结果:%s", startDate, endDate, numberOfYears,
judgeTimeDifferenceLessThanNYears(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s年内结果:%s", startDate, endDate, numberOfYears,
judgeTimeDifferenceLessThanNYears(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-02";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s年内结果:%s", startDate, endDate, numberOfYears,
judgeTimeDifferenceLessThanNYears(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2001-01-01";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s年内结果:%s", startDate, endDate, numberOfYears,
judgeTimeDifferenceLessThanNYears(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2000-12-29";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s年内结果:%s", startDate, endDate, numberOfYears,
judgeTimeDifferenceLessThanNYears(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
}
private static void testDiffDays() {
String startDate = "2021-01-01";
String endDate = "2022-01-01";
int numberOfYears = 365;
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s天内结果:%s", startDate, endDate, numberOfYears,
judgeDaysDiffLessThanNDays(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s天内结果:%s", startDate, endDate, numberOfYears,
judgeDaysDiffLessThanNDays(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-02";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s天内结果:%s", startDate, endDate, numberOfYears,
judgeDaysDiffLessThanNDays(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2001-01-01";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s天内结果:%s", startDate, endDate, numberOfYears,
judgeDaysDiffLessThanNDays(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
startDate = "2000-01-01";
endDate = "2000-12-29";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s天内结果:%s", startDate, endDate, numberOfYears,
judgeDaysDiffLessThanNDays(startDate, endDate, PATTEN_DATE_SPLIT, numberOfYears)));
}
private static void testDiffWeeks() {
String startDate = "2021-01-01";
String endDate = "2022-01-01";
int numberOfWeeks = 52;
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
startDate = "2000-01-01";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
startDate = "2000-01-02";
endDate = "2000-12-31";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
startDate = "2000-01-01";
endDate = "2001-01-01";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
startDate = "2000-01-01";
endDate = "2000-12-29";
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
startDate = "2021-12-01";
endDate = "2021-12-29";
numberOfWeeks = 4;
System.out.println(String.format("开始日期:%s,结束日期:%s,相差范围在%s周内结果:%s", startDate, endDate, numberOfWeeks,
judgeWeeksDiffLessThanNWeeks(startDate, endDate, PATTEN_DATE_SPLIT, numberOfWeeks)));
}
}