Java判断当前时间是否在某个区间内的方法--一个秒杀活动的实现思路

目录

前言:

秒杀活动需求:

实际业务代码:

测试:


前言:

一个秒杀活动:具有很鲜明的业务需求。我们抛开丢弃策略、限流、防刷、并发、降级、削峰、队列泄洪、验证码、隔离等等手段不谈。这些会在闲暇的时候会慢慢整理下。

今天讨论下判断当前活动是否被开启。是否进入秒杀或者是否结束秒杀

假设我们实现了以上种种没有在这篇文章中所谈论的技术。极端假设下:100W的用户访问量 --> 最终进入到实际业务中只有100个请求在能够控制的范围中。下面我们要对进入到实际业务中的请求进行判断。

秒杀活动需求:

秒杀活动每天8:00开始12:00结束,持续3天。 时间从 2019-08-20   -   2019-08-22

实际业务代码:

1、从mysql或者redis中获取到活动持续的时间:进行简单的判断当前时间是否在活动时间,由于使用了redis。所以这个过程会比较快的。(redis的超时时间是一个比较巧妙的办法) 

2、得到活动的开启和关闭时间(8:00和12:00)之后。我们要对当前时间进行判断。见代码

package com.bz.mall.utils;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.commons.lang3.StringUtils;

import com.hhz.basic.util.common.IntervalUtil;

/**
 * csdn时间工具类demo
 * @author liren
 *
 */
public class DateUtils {
	
    /**
	 * 判断当前时间是否在 区间内 (精确到毫秒值)
	 * @param sTime	开始区间	HH:mm:ss
	 * @param eTime	结束区间	HH:mm:ss
	 * @return 
	 * @author liren
	 */
	public static boolean JudgeTime(String sTime, String eTime) {
		long now = System.currentTimeMillis();
		String shortNow = "";
		String judge = "";
		boolean flag = false;
		try {
			// 当前时间 -> yyyy-MM-dd
			String dateShort = DateUtils.getDateShort(now);
			String sDate = String.valueOf(DateUtils.StrToLong(dateShort + " " + sTime));
			String eDate = String.valueOf(DateUtils.StrToLong(dateShort + " " + eTime));
			shortNow = String.valueOf(now);
			judge = "[" + sDate + "," + eDate + "]";

            // IntervalUtil.isInTheInterval工具类,详情请见:https://blog.csdn.net/qq_26465035/article/details/98626346
			flag = IntervalUtil.isInTheInterval(shortNow, judge);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return flag;
	}

    /**
	 * 获取当前时间的年月日
	 * @param ctime
	 * @return
	 * @author liren
	 */
	public static String getDateShort(long ctime){
		if(ctime<=0){
			return "";
		}
		SimpleDateFormat format =  new SimpleDateFormat("yyyy-MM-dd");
		return format.format(new Date(ctime)).toString();
	}


    /**
	 * 字符串 转时间戳 : yyyy-MM-dd HH:mm:ss --> 时间戳  
	 * @return
	 * @throws ParseException
	 * @author liren
	 */
	public static long StrToLong(String str) {
		Date date = null;
		long ts = 0;
		if (StringUtils.isNotEmpty(str)) {
			DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			try {
				date = df.parse(str);
				ts = date.getTime();
			} catch (ParseException e) {
				e.printStackTrace();
			}
		}
		return ts;
	}
}

测试:

发布了67 篇原创文章 · 获赞 678 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/qq_26465035/article/details/99945816