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

如何在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);
    }
}

关键细节说明

  1. 生成间隔控制:通过lastGeneratedTime记录上次生成时间,每次生成前判断当前时间是否晚于上次生成时间+24小时,不满足则计算剩余等待时间并提示。
  2. 有效期管理:生成优惠券时,将当前时间+24小时作为过期时间存入couponExpiryMap,后续可通过isCouponValid方法快速校验优惠券是否过期。
  3. 随机数优化:用Random类替代Math.random(),生成随机索引更规范,也便于后续扩展(比如设置固定种子用于测试)。

注意:当前示例使用内存存储时间和优惠券信息,程序重启后数据会丢失。如果需要持久化保存,可将数据写入数据库或本地文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:23:15