import lombok.extern.slf4j.Slf4j;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
import java.time.format.ResolverStyle;
import java.time.temporal.TemporalQuery;
import java.util.regex.Pattern;
/**
* 日期时间工具类
*
* @author
*/
@Slf4j
public final class DateTimeValidator {
/**
* 6 位纯数字年月,如 202608
*/
private static final Pattern YYYYMM = Pattern.compile("^\\d{6}$");
/**
* 8 位纯数字日期,如 20260821
*/
private static final Pattern YYYYMMDD = Pattern.compile("^\\d{8}$");
/**
* 14 位纯数字日期时间,如 20260821125959
*/
private static final Pattern YYYYMMDDHHMMSS = Pattern.compile("^\\d{14}$");
/**
* 严格模式解析 yyyyMM,uuuu 在 STRICT 下不依赖纪元
*/
private static final DateTimeFormatter YYYYMM_FORMATTER =
DateTimeFormatter.ofPattern("uuuuMM").withResolverStyle(ResolverStyle.STRICT);
/**
* 严格模式解析 yyyyMMdd,uuuu 在 STRICT 下不依赖纪元
*/
private static final DateTimeFormatter YYYYMMDD_FORMATTER =
DateTimeFormatter.ofPattern("uuuuMMdd").withResolverStyle(ResolverStyle.STRICT);
/**
* 严格模式解析 yyyyMMddHHmmss,uuuu 在 STRICT 下不依赖纪元
*/
private static final DateTimeFormatter YYYYMMDDHHMMSS_FORMATTER =
DateTimeFormatter.ofPattern("uuuuMMddHHmmss").withResolverStyle(ResolverStyle.STRICT);
private DateTimeValidator() {
}
/**
* 校验字符串是否为合法的 yyyyMM 格式年月(如 202608)
* <p>
* 仅 6 位纯数字且月份在 01-12 才返回 true,
* 例如 202613、2026-8 均返回 false。
*
* @param yearMonth 待校验字符串
* @return true-合法,false-非法
*/
public static boolean isValidYearMonth(String yearMonth) {
return matchesAndParses(yearMonth, YYYYMM, YYYYMM_FORMATTER, YearMonth::from);
}
/**
* 校验字符串是否为合法的 yyyyMMdd 格式日期(如 20260821)
* <p>
* 仅 8 位纯数字且为真实存在的日期才返回 true,
* 例如 20261301、20260230 均返回 false。
*
* @param date 待校验字符串
* @return true-合法,false-非法
*/
public static boolean isValidDate(String date) {
return matchesAndParses(date, YYYYMMDD, YYYYMMDD_FORMATTER, LocalDate::from);
}
/**
* 校验字符串是否为合法的 yyyyMMddHHmmss 格式日期时间(如 20260821125959)
* <p>
* 仅 14 位纯数字且为真实存在的时间才返回 true,
* 例如 20260828245959(小时非法)、20260230125959(2月30日不存在)均返回 false。
*
* @param dateTime 待校验字符串
* @return true-合法,false-非法
*/
public static boolean isValidDateTime(String dateTime) {
return matchesAndParses(dateTime, YYYYMMDDHHMMSS, YYYYMMDDHHMMSS_FORMATTER, LocalDateTime::from);
}
/**
* 先用正则约束格式,再严格解析校验真实性
*/
private static boolean matchesAndParses(String text, Pattern pattern, DateTimeFormatter formatter, TemporalQuery<?> query) {
if (text == null || !pattern.matcher(text).matches()) {
return false;
}
try {
formatter.parse(text, query);
return true;
} catch (DateTimeParseException e) {
return false;
}
}
public static void main(String[] args) {
log.info("isValidDate(\"20260828\") = {}, 期望 true", DateTimeValidator.isValidDate("20260828"));
log.info("isValidDate(\"20261301\") = {}, 期望 false (月份非法)", DateTimeValidator.isValidDate("20261301"));
log.info("isValidDate(\"20260230\") = {}, 期望 false (2月30日不存在)", DateTimeValidator.isValidDate("20260230"));
log.info("isValidDate(\"2026-8-21\") = {}, 期望 false (含分隔符)", DateTimeValidator.isValidDate("2026-8-21"));
log.info("isValidDate(null) = {}, 期望 false", DateTimeValidator.isValidDate(null));
log.info("isValidYearMonth(\"202608\") = {}, 期望 true", DateTimeValidator.isValidYearMonth("202608"));
log.info("isValidYearMonth(\"202613\") = {}, 期望 false (月份非法)", DateTimeValidator.isValidYearMonth("202613"));
log.info("isValidYearMonth(\"2026-8\") = {}, 期望 false (含分隔符)", DateTimeValidator.isValidYearMonth("2026-8"));
log.info("isValidYearMonth(null) = {}, 期望 false", DateTimeValidator.isValidYearMonth(null));
log.info("isValidDateTime(\"20260821125959\") = {}, 期望 true", DateTimeValidator.isValidDateTime("20260821125959"));
log.info("isValidDateTime(\"20260821246060\") = {}, 期望 false (时分秒非法)", DateTimeValidator.isValidDateTime("20260821246060"));
log.info("isValidDateTime(\"20260230125959\") = {}, 期望 false (2月30日不存在)", DateTimeValidator.isValidDateTime("20260230125959"));
log.info("isValidDateTime(\"2026-08-21 12:59:59\") = {}, 期望 false (含分隔符)", DateTimeValidator.isValidDateTime("2026-08-21 12:59:59"));
log.info("isValidDateTime(null) = {}, 期望 false", DateTimeValidator.isValidDateTime(null));
}
}
日期时间工具类
于 2026-08-21 21:01:51 首次发布

174

被折叠的 条评论
为什么被折叠?



