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点
无法使用

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

你可以封装一个 JavaScript 函数,接收类似 `"2025-09-24 17:40"` 的时间字符串,提取日期部分,并返回格式为 `"2025-09-24 周几"` 的结果,其中“周几”是中文星期(如“周三”)。 --- ### ✅ 封装代码如下: ```javascript /** * 格式化时间:输入 "YYYY-MM-DD HH:mm" 格式的时间,返回 "YYYY-MM-DD 周X" * @param {string} dateTime - 时间字符串,例如 "2025-09-24 17:40" * @returns {string} 格式化后的字符串,例如 "2025-09-24 周三" */ function formatDateWithWeek(dateTime) { // 定义星期映射(中文) const weeks = ['日', '一', '二', '三', '四', '五', '六']; // 创建 Date 对象(自动解析标准时间格式) const date = new Date(dateTime); // 如果无效时间,返回提示 if (isNaN(date.getTime())) { throw new Error('Invalid date format'); } // 提取年月日 const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始 const day = String(date.getDate()).padStart(2, '0'); // 获取星期几 const weekDay = weeks[date.getDay()]; // getDay() 返回 0~6 // 拼接结果 return `${year}-${month}-${day} 周${weekDay}`; } ``` --- ### ✅ 使用示例: ```javascript console.log(formatDateWithWeek("2025-09-24 17:40")); // 输出:2025-09-24 周三 console.log(formatDateWithWeek("2025-09-28 10:00")); // 输出:2025-09-28 周日 ``` --- ### 🔍 代码解释: | 部分 | 说明 | |------|------| | `new Date(dateTime)` | 自动解析 `"2025-09-24 17:40"` 成 Date 对象 | | `getDay()` | 返回 0(周日)到 6(周六),用于索引 `weeks` 数组 | | `padStart(2, '0')` | 确保月份和日期是两位数(如 `9 -> 09`) | | `weeks[date.getDay()]` | 将数字转换为中文“周几” | --- ### ✅ 扩展建议(可选增强) #### 支持更宽松的输入格式(比如只传日期): ```js // 可以处理 "2025-09-24" 或 "2025-09-24 17:40" const dateStr = dateTime.split(' ')[0]; // 只取日期部分 const date = new Date(dateStr); ``` #### 返回数组或对象形式(便于进一步使用): ```js return { date: `${year}-${month}-${day}`, week: `周${weekDay}`, full: `${year}-${month}-${day} 周${weekDay}` }; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值