java-固定周几才可以使用的校验

先举个例子说明一下

就比如使用红包的时候,如果要让它只有在周一到周五才能使用。首先想到的是不就是服务器端弄个数组,数据库弄个子表就行了吗?

但是组长告诉我不这么做,要用二进制算法去做@_@

用二进制的7位数代表一周的每一天
1111111 //全天可用(127)
0000000 //全天不能用(0)
也就是说数据库里就存一个0到127的数字

哪一天代表哪位数可以随便定义。
这想法还是头一次见,感觉有点意思(☆_☆)

首先,定义如下:

private static Map<Integer,String> weekMap=new HashMap<Integer, String>(8);
	static{
		weekMap.put(0, "周天");
		weekMap.put(1, "周一");
		weekMap.put(2, "周二");
		weekMap.put(3, "周三");
		weekMap.put(4, "周四");
		weekMap.put(5, "周五");
		weekMap.put(6, "周六");
	}

这里周天就代表2的0次方 //0000001
周一代表2的1次方 //0000010
周二代表2的2次方 //0000100
周三代表2的3次方 //0001000

具体实现代码如下:

@Test
	public void demo() {
		//参数
		Integer parameter=2;
		if(!weekMap.containsKey(parameter)) {
			throw new RuntimeException("参数异常");
		}
		int week=1<<parameter;
		Calendar cal=Calendar.getInstance();		//获取日历对象
		cal.setTime(new Date());							//设置日历时间
		int i = cal.get(Calendar.YEAR);				//获取日历当前年份
		int j = cal.get(Calendar.MONTH);			//获取日历当前月份(从0开始)
		int k = cal.get(Calendar.DATE);				//获取日历当前日期
		int l = cal.get(Calendar.HOUR_OF_DAY);//获取日历当前小时(24小时制)
		int m = cal.get(Calendar.AM_PM);			//获取日历当前是上午还是下午
		int n = cal.get(Calendar.DAY_OF_WEEK);//获取日历当前周几(周天为1,周一为2,所以下面要-1)
		System.out.println(i+"年"+(j+1)+"月"+k+"日"+"周"+(n-1)+(m==0?"上午":"下午")+l+"点");
		if((week>>(n-1))%2>0) {
			System.out.println("可以使用");
		}else {
			System.out.println("无法使用");
		}
	}

打印的结果是:

2022年1月11日周2下午16点
可以使用

分析一下

关键的在于(week>>(n-1))%2>0
比如周二是0000100
向右移个两位就变成了0000001
求余2是不是就多出来了个1
实际上week就是1向左移两位得出来的,再向右移不就变回来了

如果要多选的话也只要改一个地方

@Test
	public void demo() {
		//参数
		Integer[] parameter=new Integer[] {1,3,4};
		for(Integer data : parameter) {
			if(!weekMap.containsKey(data)) {
				throw new RuntimeException("参数异常");
			}
		}
		int week=(1<<parameter[0])+(1<<parameter[1])+(2<<parameter[2]);
		Calendar cal=Calendar.getInstance();		//获取日历对象
		cal.setTime(new Date());							//设置日历时间
		int i = cal.get(Calendar.YEAR);				//获取日历当前年份
		int j = cal.get(Calendar.MONTH);			//获取日历当前月份(从0开始)
		int k = cal.get(Calendar.DATE);				//获取日历当前日期
		int l = cal.get(Calendar.HOUR_OF_DAY);//获取日历当前小时(24小时制)
		int m = cal.get(Calendar.AM_PM);			//获取日历当前是上午还是下午
		int n = cal.get(Calendar.DAY_OF_WEEK);//获取日历当前周几(周天为1,周一为2,所以下面要-1)
		System.out.println(i+"年"+(j+1)+"月"+k+"日"+"周"+(n-1)+(m==0?"上午":"下午")+l+"点");
		if((week>>(n-1))%2>0) {
			System.out.println("可以使用");
		}else {
			System.out.println("无法使用");
		}
	}

打印结果:

2022年1月11日周2下午16点
无法使用

最后
有兴趣的小伙伴可以多拿来测试测试,如果有问题随时可以在下方的评论发表意见<( ̄︶ ̄)>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值