一、需求说明
用户开通vip后,每月可领取1张优惠券,不能重复领取。即用户2021-03-12 12:35:34开通vip,那在2021-03-12 12:35:34至2021-04-12 12:35:34期间只能领取1张优惠券,不能重复领取。
二、逻辑阐述

-
计算媒介时间
假如当前时间为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;
}
- 测试返回

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




