最近产品又提出了一个比较二逼的需求,非要选择第几月的第几周,网上也没有现成的控件,我就自己研究了一个出来,原理到也很简单。代码如下
环境是微信小程序
先把大概样式搭建出来
<view class="date-picker">
<picker mode="selector" range="{{months}}" bindchange="onMonthChange">
<view>{{selectedMonth}}月</view>
</picker>
<picker mode="selector" range="{{weeks}}" bindchange="onWeekChange">
<view>第{{selectedWeek}}周</view>
</picker>
</view>
JS部分,通过选择的月和周再去计算日期,最终得到开始日期和结束日期,我是以周一到周日为一个周期计算,可以自己调整
onMonthChange (e) {
const index = Number(e.detail.value);
this.setData({
selectedMonth: index + 1
});
},
// 当选择周数变化时触发
onWeekChange (e) {
const index = e.detail.value;
const selectedWeek = this.data.weeks[index];
this.setData({
selectedWeek: selectedWeek
});
this.calculateDates();
},
calculateDates () {
// 获取当前年份
const currentYear = new Date().getFullYear();
// 获取选择的月份
const month = parseInt(this.data.selectedMonth);
const selectedWeek = this.data.selectedWeek;
// 获取该月的第一天
const startOfMonth = new Date(currentYear, month - 1, 1);
// 计算该月第一个星期一是哪一天
let firstMonday = 2 - startOfMonth.getDay(); // 2表示星期一的索引
if (firstMonday < 0) {
firstMonday += 7;
}
// 计算目标周的开始日期
const startOfWeek = new Date(startOfMonth);
startOfWeek.setDate(startOfMonth.getDate() + firstMonday + (selectedWeek - 1) * 7);
// 设置结束日期为该周的周日
const endOfWeek = new Date(startOfWeek);
endOfWeek.setDate(endOfWeek.getDate() + 6);
// 转换日期格式为 "yyyy-mm-dd"
const startDateStr = startOfWeek.toISOString().split('T')[0];
const endDateStr = endOfWeek.toISOString().split('T')[0];
this.setData({
startDate: startDateStr,
endDate: endDateStr
});
console.log(startDateStr, endDateStr);
}
最终效果