You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java密码90天过期提醒及过期后30天宽限期计算实现疑问

密码过期与宽限期校验实现方案

核心需求梳理

  • 密码90天内过期:显示「密码将在90天内过期」通知
  • 密码过期后进入30天宽限期:此期间发送通知
  • 宽限期结束后:强制要求用户更新密码

现有代码问题分析

你当前的宽限期计算逻辑有误:错误地以当前日期为起点加30天,而非以密码过期日期为起点计算宽限期截止日。正确的逻辑应该是先算出「过期日+30天」的宽限期截止点,再判断当前日期是否处于「过期日 < 当前日期 ≤ 宽限期截止日」区间内。

修正后的代码实现

基于你现有代码的修正版本

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.Locale;

public class PasswordExpiryChecker {
    public static void main(String args[]) throws Exception {
        SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yy", Locale.ENGLISH);
        try {
            int expiryWarningDays = 90;
            int gracePeriodDays = 30;
            
            // 密码过期日期
            Date expiryDate = formatter.parse("12-04-2024");
            Instant expiryInstant = expiryDate.toInstant();
            Instant now = Instant.now(); // 测试时可替换为手动指定的日期,比如formatter.parse("16-04-2024").toInstant()
            
            // 计算当前日期到过期日的天数差
            long daysToExpiry = Duration.between(now, expiryInstant).toDays();
            
            // 1. 校验90天内过期的情况
            if (daysToExpiry <= expiryWarningDays && daysToExpiry > 0) {
                System.out.println("密码将在90天内过期");
            } 
            // 2. 校验已过期且处于宽限期的情况
            else if (daysToExpiry <= 0) {
                // 计算宽限期截止日:过期日 + 30天
                Instant gracePeriodEnd = expiryInstant.plus(gracePeriodDays, ChronoUnit.DAYS);
                long daysToGraceEnd = Duration.between(now, gracePeriodEnd).toDays();
                
                if (daysToGraceEnd >= 0) {
                    System.out.println("您处于密码更新宽限期内,请尽快修改密码");
                } 
                // 3. 宽限期已过,强制修改
                else {
                    System.out.println("密码宽限期已过,请立即修改密码");
                }
            } 
            // 4. 过期日还远,无需提示
            else {
                System.out.println("密码有效期充足");
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

推荐使用Java 8+ 新日期API(更安全、简洁)

SimpleDateFormat存在线程不安全问题,推荐使用java.time包下的日期API:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class PasswordExpiryChecker {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd-MM-yy", Locale.ENGLISH);
        int expiryWarningDays = 90;
        int gracePeriodDays = 30;
        
        // 密码过期日期
        LocalDate expiryDate = LocalDate.parse("12-04-2024", formatter);
        LocalDate now = LocalDate.now(); // 测试时可替换为LocalDate.of(2024,4,16)
        
        // 计算当前日期到过期日的天数差
        long daysToExpiry = java.time.temporal.ChronoUnit.DAYS.between(now, expiryDate);
        
        if (daysToExpiry <= expiryWarningDays && daysToExpiry > 0) {
            System.out.println("密码将在90天内过期");
        } else if (daysToExpiry <= 0) {
            LocalDate gracePeriodEnd = expiryDate.plusDays(gracePeriodDays);
            long daysToGraceEnd = java.time.temporal.ChronoUnit.DAYS.between(now, gracePeriodEnd);
            
            if (daysToGraceEnd >= 0) {
                System.out.println("您处于密码更新宽限期内,请尽快修改密码");
            } else {
                System.out.println("密码宽限期已过,请立即修改密码");
            }
        } else {
            System.out.println("密码有效期充足");
        }
    }
}

关键逻辑说明

  1. 宽限期截止日计算:直接基于密码过期日期加上30天,而非当前日期
  2. 区间判断:
    • 当daysToExpiry > 0且≤90:触发90天内过期提醒
    • 当daysToExpiry ≤0且当前日期≤宽限期截止日:触发宽限期提醒
    • 当当前日期>宽限期截止日:触发强制修改密码提示

内容的提问来源于stack exchange,提问作者Priyanka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:31:27