elementplus、vue3显示第几周(el-date-picker)

最近有个功能,需要拿到日期和年份、周别,我选用了elementplus的 el-date-picker 组件,使用过程中踩坑了,这里记录下

官方文档

通过在官网实验,发现只显示第几周,我要的是××××年第×周这样的效果,这个满足不了我的需求,所以需要改造下 image.pngimage.png

踩坑之路

话不多说,看核心代码

<el-form-item label="周:" prop="exactDate">
  <el-date-picker v-model="ruleForm.exactDate" type="week" format=" YYYY 年第 w 周 " value-format="YYYY-MM-DD"
	placeholder="选择周">
  </el-date-picker>
</el-form-item>

  //保存数据
     const handleSaveData = () => {
      const dateStr = ruleForm.exactDate.split('-')
      const data = {
        id: state.handleId,
        year: dateStr[0],
        week: getWeek(dateStr),
        productId: ruleForm.productId,
        code: ruleForm.code,
        name: ruleForm.name,
        unit: ruleForm.unit,
        specification: ruleForm.specification,
        quantityDemanded: ruleForm.quantityDemanded,
        exactDate: ruleForm.exactDate
      }
      update(data).then(res => {
        getTableData()
        ElMessage.success('恭喜您,保存成功!')
      })
    }
    
    //根据日期获取第几周
    function getWeek(dateTime) {
      let a = dateTime[0]
      let b = dateTime[1]
      let c = dateTime[2]
      var date1 = new Date(a, parseInt(b) - 1, c),  //当前日期  
        date2 = new Date(a, 0, 1),  //当年第一天  
        // d是当前日期是今年第多少天  
        d = Math.round((date1.valueOf() - date2.valueOf()) / (24*60*60*1000));
      // d + 当前年的第一天的周差距的和在除以7就是本年第几周  
      let week = Math.ceil((d + (date2.getDay() + 1 - 1)) / 7);
      return week
    }

看效果 在这里插入图片描述 发现正常选择没问题,但是当我跨年选择,选2025年一月第一周的时候,月份变了年份还是2024,这不扯呢吗 那我把组件的类型改成日期试 试type="date"

        <el-date-picker v-model="ruleForm.exactDate" type="date" format=" YYYY 年第 w 周 " value-format="YYYY-MM-DD"
                placeholder="选择周">
              </el-date-picker>

在这里插入图片描述 发现2025年第一周可以,在2024年那一页选2024年12月31日怎么还是显示2024年第一周,应该是2025年第一周才对呀(这个可能是组件算法的问题,有兴趣的可以去自行研究),而且保存显示的是2024年第53周,一年才52周,你给我出来53周就离谱了,再接着改吧。

解决方案

既然可能组件显示××××年第×周有问题,那我就退而求其次把年去掉算了,只要数据对,table正常显示就行了, 这里年份在取周次的时候进行了一下处理,代码如下

    <el-form-item label="周:" prop="exactDate">
              <el-date-picker v-model="ruleForm.exactDate" type="date" format=" 第 w 周 " value-format="YYYY-MM-DD"
                placeholder="选择周" >
              </el-date-picker>
	 </el-form-item>
	
	//保存数据
    const handleSaveData = () => {
      const dateStr = ruleForm.exactDate.split('-')
      const data = {
        id: state.handleId,
        week: getWeek(dateStr),
        year: ruleForm.year,
        productId: ruleForm.productId,
        code: ruleForm.code,
        name: ruleForm.name,
        unit: ruleForm.unit,
        specification: ruleForm.specification,
        quantityDemanded: ruleForm.quantityDemanded,
        exactDate: ruleForm.exactDate
      }
      update(data).then(res => {
        getTableData()
        ElMessage.success('恭喜您,保存成功!')
      })
    }
    // 根据日期获取第几周
    function getWeek(dateTime) {
      let a = dateTime[0]
      let b = dateTime[1]
      let c = dateTime[2]
      var date1 = new Date(a, parseInt(b) - 1, c),  //当前日期  
        date2 = new Date(a, 0, 1),  //当年第一天  
        // d是当前日期是今年第多少天  
        d = Math.round((date1.valueOf() - date2.valueOf()) / (24*60*60*1000));
      // d + 当前年的第一天的周差距的和在除以7就是本年第几周  
      let week = Math.ceil((d + date2.getDay()) / 7);
      //一年只有52周,当出现53的时候一定是跨年的情况出现了,需要年份加1,周为第一周
      if (week == 53) {
        week = 1
        ruleForm.year = parseInt(a)+1
      }else{
        ruleForm.year = a
      }
      return week
    }

在这里插入图片描述

上一篇:Python实现PSO粒子群优化算法优化CNN-Transformer回归模型(优化神经元数量和迭代次数)项目实战-1.项目背景


下一篇:sql专题 之 常用命令-删除