通过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
相关推荐
皙然2 小时前
SpringBoot 自动装配深度解析:从底层原理到自定义 starter 实战(含源码断点调试)
java·spring boot·spring
NE_STOP2 小时前
SpringBoot3-外部化配置与aop实现
java
ThinkPet2 小时前
【AI】大模型知识入门扫盲以及SpringAi快速入门
java·人工智能·ai·大模型·rag·springai·mcp
派大鑫wink2 小时前
【Day39】Spring 核心注解:@Component、@Autowired、@Configuration 等
java·后端·spring
输出输入3 小时前
JAVA能进行鸿蒙系统应用的开发吗
java
a努力。3 小时前
宇树Java面试被问:数据库死锁检测和自动回滚机制
java·数据库·elasticsearch·面试·职场和发展·rpc·jenkins
PwnGuo3 小时前
Android逆向:在 Unidbg 中解决 native 函数内调用 Java 方法的报错
android·java·python
输出输入3 小时前
IJ IDEA 目录结构
java
Kratzdisteln3 小时前
【1902】预先生成完整的树状PPT结构
java·前端·powerpoint