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("密码有效期充足"); } } }
关键逻辑说明
- 宽限期截止日计算:直接基于密码过期日期加上30天,而非当前日期
- 区间判断:
- 当
daysToExpiry > 0且≤90:触发90天内过期提醒 - 当
daysToExpiry ≤0且当前日期≤宽限期截止日:触发宽限期提醒 - 当当前日期>宽限期截止日:触发强制修改密码提示
- 当
内容的提问来源于stack exchange,提问作者Priyanka
相关产品推荐
相关产品推荐

