通过LocalDateTime判断当前日期是否失效(附Java 中常用的 ISO 格式)

代码功能解析

  1. 获取当前时间LocalDateTime.now() 获取当前日期时间

  2. 遍历证书列表:对每个证书进行过期检查

  3. 状态默认值status = 1(默认有效)

  4. 过期判断逻辑

    • 尝试将日期字符串解析为 LocalDateTime

    • 如果失败,尝试解析为 LocalDate

    • 两种格式都解析失败时保持默认值 1

  5. 状态设置:将状态转换为字符串设置到证书对象

java 复制代码
// 明确日期格式
private static final DateTimeFormatter[] DATE_FORMATTERS = {
    DateTimeFormatter.ISO_LOCAL_DATE_TIME,
    DateTimeFormatter.ISO_LOCAL_DATE
};

public void checkCertificateExpiry(List<Certificate> certificates) {
    LocalDateTime now = LocalDateTime.now();
    LocalDate today = now.toLocalDate();
    
    for (Certificate cert : certificates) {
        String expiryDateStr = cert.getExpiryDate();
        if (StringUtils.isBlank(expiryDateStr)) {
            cert.setCertificateStatus("1"); // 无过期日期视为有效
            continue;
        }
        
        boolean isExpired = false;
        // 尝试解析不同格式
        for (DateTimeFormatter formatter : DATE_FORMATTERS) {
            try {
                TemporalAccessor parsed = formatter.parse(expiryDateStr);
                if (parsed.isSupported(ChronoField.HOUR_OF_DAY)) {
                    // 包含时间部分
                    LocalDateTime expiryDateTime = LocalDateTime.from(parsed);
                    isExpired = expiryDateTime.isBefore(now);
                } else {
                    // 仅日期部分
                    LocalDate expiryDate = LocalDate.from(parsed);
                    isExpired = expiryDate.isBefore(today);
                }
                break; // 解析成功则跳出
            } catch (DateTimeParseException e) {
                // 继续尝试下一种格式
                continue;
            }
        }
        
        cert.setCertificateStatus(isExpired ? "0" : "1");
    }
}

代码中举例的日期格式为:

1. ISO_LOCAL_DATE - 仅日期格式

  • 格式yyyy-MM-dd

  • 示例

    • 2024-12-25

    • 2024-01-05

    • 1999-12-31

  • 特点:包含年、月、日,用连字符分隔

2. ISO_LOCAL_DATE_TIME - 日期时间格式

  • 格式yyyy-MM-dd'T'HH:mm:ssyyyy-MM-dd'T'HH:mm:ss.SSS

  • 示例

    • 2024-12-25T08:30:00(完整秒)

    • 2024-12-25T08:30:00.000(毫秒)

    • 2024-12-25T08:30(分钟)

    • 2024-12-25T08:30:00.123456789(纳秒)

  • 特点

    • 日期和时间用大写字母 T 分隔

    • 时间部分可以省略秒、纳秒

    • 24小时制

java 复制代码
// Java 中常用的 ISO 格式
DateTimeFormatter.ISO_LOCAL_DATE          // 2024-12-25
DateTimeFormatter.ISO_LOCAL_TIME          // 08:30:00
DateTimeFormatter.ISO_LOCAL_DATE_TIME     // 2024-12-25T08:30:00
DateTimeFormatter.ISO_INSTANT             // 2024-12-25T00:30:00Z (UTC)
DateTimeFormatter.ISO_ZONED_DATE_TIME     // 2024-12-25T08:30:00+08:00[Asia/Shanghai]
DateTimeFormatter.ISO_OFFSET_DATE_TIME    // 2024-12-25T08:30:00+08:00
DateTimeFormatter.ISO_DATE                // 2024-12-25 或 2024-12-25+08:00
DateTimeFormatter.ISO_TIME                // 08:30:00 或 08:30:00+08:00
DateTimeFormatter.ISO_DATE_TIME           // 2024-12-25T08:30:00 或 2024-12-25T08:30:00+08:00
相关推荐
鹅城剑仙3 小时前
Java线程池完全指南
java
李白的天不白3 小时前
SmartAdmin(基于 Spring Boot 框架)中配置跨域请求 VUE3 设置请求头
java·前端
橙子进阶之路3 小时前
Java线程(CompletableFuture)
java·开发语言
鹅城剑仙3 小时前
Java CompletableFuture 异步编程完全指南
java
2601_961875244 小时前
法考备考计划表|学习计划|资料已整理
java·开发语言·学习·eclipse·tomcat·c#·hibernate
重生之我是Java开发战士4 小时前
【Java SE】多线程(三):单例模式,阻塞队列,线程池与定时器
java·javascript·单例模式
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第115题】【并发篇】第15题:说一下悲观锁和乐观锁的区别?
java·开发语言·面试
心之伊始4 小时前
Spring Boot Actuator + Micrometer 实战:自定义业务指标并接入 Prometheus 观测接口耗时
java·spring boot·prometheus·actuator·micrometer
Full Stack Developme4 小时前
Spring Integration 教程
java·后端·spring
摇滚侠4 小时前
MyBatis 入门到项目实战 MyBatis 分页插件 65-66
java·开发语言·sql·mybatis