通过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
相关推荐
jufeng13071 小时前
【系列:TDengine 工业物联网实战:从零搭起可运行系统 · 第 8 篇】
java·spring boot·时序数据库·tdengine
程序员贺加贝2 小时前
轻制造SaaS的生产闭环建模-BOM工单领料报工质检与入库
java·设计模式·架构
敲个大西瓜3 小时前
Spring Could Alibaba 核心面试题
java·后端·spring
骇客野人3 小时前
Java SSO 统一认证方案
java·开发语言
START_GAME3 小时前
MSSQL$SQL2016
java·服务器·前端
ydd1001004 小时前
字符串转换整数
java
会编程的吕洞宾4 小时前
DeepAgents In Action学习(Second)
android·java·学习
梦梦代码精4 小时前
基于UniApp+Vue3+ThinkPHP 8,这套知识付费系统的架构设计有点东西
java·低代码·docker·uni-app·开源·php
-凌凌漆-4 小时前
【freertos】Task创建(v2)
java·开发语言·算法
牛油果子哥q5 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++