暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

Java实现"vip领取优惠券限制1次/月"功能

一叶扁舟 2021-02-20
985

一、需求说明

用户开通vip后,每月可领取1张优惠券,不能重复领取。即用户2021-03-12 12:35:34开通vip,那在2021-03-12 12:35:34至2021-04-12 12:35:34期间只能领取1张优惠券,不能重复领取。

二、逻辑阐述

image.png

  • 计算媒介时间
    假如当前时间为2021-03-15 09:38:21,开vip的时间是2021-03-12 12:35:34。
    那么,媒介时间即为2021-03-12 12:35:34。即年、月为当前时间的年、月,日、时、分、秒为开通会员的日、时、分、秒。

  • 重复领取区间的判定
    假如当前时间为2021-03-15 09:38:21,媒介时间为2021-03-12 12:35:34,那么由于当前时间>媒介时间,则重复领取区间为2021-03-12 12:35:34 -> 2021-04-12 12:35:34

  • 判断是否重复领取
    当上次领取时间在重复领取区间内,则判定本次领取为重复领取

三、代码实现

  • 代码实现

传入参数
latestTime:上次领取时间
vipStartTime:vip开通时间

返回值
true: 重复领取
false: 不重复

public Boolean isRepeatReceive(Date latestTime, Date vipStartTime) { // 当前时间 Date nowTime = new Date(); if (latestTime == null){ return false; } // 获取限制时间范围 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat ymd = new SimpleDateFormat("yyyy-MM"); SimpleDateFormat hms = new SimpleDateFormat("-dd HH:mm:ss"); try { Date middleTime = df.parse(ymd.format(nowTime) + hms.format(vipStartTime)); // 当前时间大于媒介时间 if (nowTime.compareTo(middleTime) > 0){ // 上次领取时间不在媒介时间 -> 媒介时间+1月之间则不重复 Date maxLimitDate = Date.from(middleTime.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime().plusMonths(1).toInstant(ZoneOffset.of("+8"))); if (latestTime.compareTo(middleTime)<0 || latestTime.compareTo(maxLimitDate)>0){ return false; } }else{ // 上次领取时间不在媒介时间-1月 -> 媒介时间之间则不重复 Date minLimitDate = Date.from(middleTime.toInstant().atOffset(ZoneOffset.of("+8")).toLocalDateTime().minusMonths(1).toInstant(ZoneOffset.of("+8"))); if (latestTime.compareTo(minLimitDate)<0 || latestTime.compareTo(middleTime)>0){ return false; } } } catch (ParseException e) { log.error(LogUtil.getStack(e)); } return true; }
  • 测试返回
    image.png

如果你有更好的方法,欢迎评论赐教,感谢!

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论