如何在Java中为随机生成的字母数字优惠券设置24小时有效期
实现带24小时有效期与生成间隔的优惠券功能
针对你现有的优惠券生成程序,要实现优惠券24小时有效期和24小时后才能生成下一张优惠券的需求,可以通过记录时间戳和有效期的方式实现,以下是修改后的完整实现方案:
修改核心思路
- 用类变量记录上次生成优惠券的时间,确保每次生成间隔不小于24小时
- 用Map存储每张优惠券对应的过期时间,便于后续校验有效性
- 使用
java.time.LocalDateTime处理时间,比传统Date类更简洁易用
完整代码实现
import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; import java.util.Random; public class Discount { // 记录上次生成优惠券的时间 private static LocalDateTime lastGeneratedTime; // 存储优惠券与对应过期时间的映射 private static Map<String, LocalDateTime> couponExpiryMap = new HashMap<>(); // 固定优惠券字符集 private static final String COUPON_PATTERN = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; // 使用Random替代Math.random(),生成随机数更可控 private static final Random RANDOM = new Random(); public static String generateCouponCode() { // 校验是否满足24小时生成间隔 if (lastGeneratedTime != null) { LocalDateTime now = LocalDateTime.now(); if (now.isBefore(lastGeneratedTime.plusHours(24))) { long remainingHours = lastGeneratedTime.plusHours(24).getHour() - now.getHour(); long remainingMinutes = lastGeneratedTime.plusHours(24).getMinute() - now.getMinute(); System.out.printf("需等待 %d小时%d分钟后才能生成下一张优惠券%n", remainingHours, remainingMinutes); return null; } } // 生成10位随机优惠券码 StringBuilder couponCode = new StringBuilder(10); for (int i = 0; i < 10; i++) { int index = RANDOM.nextInt(COUPON_PATTERN.length()); couponCode.append(COUPON_PATTERN.charAt(index)); } String finalCoupon = couponCode.toString(); // 更新上次生成时间 lastGeneratedTime = LocalDateTime.now(); // 计算并存储优惠券过期时间(当前时间+24小时) LocalDateTime expiryTime = lastGeneratedTime.plusHours(24); couponExpiryMap.put(finalCoupon, expiryTime); System.out.println("优惠券生成成功...."); System.out.printf("生成的优惠券码: %s%n", finalCoupon); System.out.printf("该优惠券有效期至: %s%n", expiryTime); return finalCoupon; } // 新增校验优惠券有效性的方法 public static boolean isCouponValid(String couponCode) { if (!couponExpiryMap.containsKey(couponCode)) { System.out.println("该优惠券不存在"); return false; } LocalDateTime expiryTime = couponExpiryMap.get(couponCode); boolean isValid = LocalDateTime.now().isBefore(expiryTime); System.out.printf("优惠券[%s] %s%n", couponCode, isValid ? "有效" : "已过期"); return isValid; } public static void main(String[] args) { // 第一次生成优惠券 Discount.generateCouponCode(); // 立即再次尝试生成,会提示需等待 Discount.generateCouponCode(); // 示例:校验优惠券有效性(替换为实际生成的优惠券码) // String testCoupon = "XXXXXXXXX"; // Discount.isCouponValid(testCoupon); } }
关键细节说明
- 生成间隔控制:通过
lastGeneratedTime记录上次生成时间,每次生成前判断当前时间是否晚于上次生成时间+24小时,不满足则计算剩余等待时间并提示。 - 有效期管理:生成优惠券时,将当前时间+24小时作为过期时间存入
couponExpiryMap,后续可通过isCouponValid方法快速校验优惠券是否过期。 - 随机数优化:用
Random类替代Math.random(),生成随机索引更规范,也便于后续扩展(比如设置固定种子用于测试)。
注意:当前示例使用内存存储时间和优惠券信息,程序重启后数据会丢失。如果需要持久化保存,可将数据写入数据库或本地文件。
内容的提问来源于stack exchange,提问作者Stakiyo Dcosta
相关产品推荐
相关产品推荐

