通过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
相关推荐
IT_Octopus33 分钟前
Spring Boot 中 ThreadLocal 请求上下文的完整生命周期
java·spring boot·spring
用户40966601317511 小时前
Lombok 你用对了吗?@Data 之外的 6 个隐藏神器
java·后端·代码规范
梅头脑1 小时前
交易跨10个库、日均千万订单——选错一次分布式事务方案,加班三个月重写
java·分布式
久久学姐1 小时前
基础转码学 AI:Java+Python 双语言入门,3 个月可落地实战项目
java·python·ai·转码·实战项目
花生了什么事o1 小时前
synchronized 与 ReentrantLock:Java 锁机制原理与实现对比
java·开发语言
长不胖的路人甲2 小时前
Serial 串行、Parallel 并行、CMS 并发收集器
java·开发语言·jvm
IT_Octopus3 小时前
Spring Boot 线程池关闭:destroyMethod 的作用与最佳实践
java·spring boot·后端
亦暖筑序3 小时前
AgentScope-Java 入门:完善 Vue 前端、发布 GitHub,并规划下一步
java·前端·vue.js
wddptwd283 小时前
android studio 报错怎么处理 java.lang.NullPointerException
android·java·android studio
霸道流氓气质4 小时前
分布式系统中接口时序不确定性处理
java·开发语言·分布式