获取时隔半个钟的三天与el-time-select

在这里插入图片描述
摘要:

今天遇到需求是配送时间,时隔半个钟的排线!所以需要拼接时间!例如2024-10-08 14:30,2024-10-08 15:00,2024-10-08 15:30
在这里插入图片描述

<el-form-item label="配送时间:" prop="spOrderTime">
    <el-select v-model="form.spOrderTime" clearable style="width: 240px" @change="changeOrderTime">
    <!-- <el-option v-for="item in Config.selectTimeOption" :key="item.value" :label="item.label"
          :value="item.value"></el-option> -->
             <el-option v-for="item in Config.selectTimeOption" :key="item.index" :label="item.value"
                 :value="item.value">
             </el-option>
     </el-select>
</el-form-item>
// 获取配送时间数组
    deliveryTimeList() {
      const now = dayjs();// 获取当前时间
      const threeDaysLater = now.add(2, 'day').endOf('day'); //3天后的日期
      const timePoints = [];//每个半小时整点的时间点
      let currentTime = now.startOf('hour');
      // 如果当前时间不是00分或30分,则跳到下一个半小时整点
      if (currentTime.minute() !== 0 && currentTime.minute() !== 30) {
        if (currentTime.minute() < 30) {
          currentTime = currentTime.set('minute', 30);
        } else {
          currentTime = currentTime.add(1, 'hour').startOf('hour');
        }
      }
      // 循环生成每个半小时整点的时间点
      let index=0
      while (currentTime.isBefore(threeDaysLater) || currentTime.isSame(threeDaysLater)) {
        timePoints.push({
          index:index,
          value:currentTime.format('YYYY-MM-DD HH:mm')
        });
        currentTime = currentTime.add(30, 'minute'); 
        index++
      }
      // 赋值
      this.Config.selectTimeOption = timePoints
      this.form.spOrderTime=timePoints[0].value
    },
// 获取每隔半小时的三天时间数组
export const getDeliveryTimeList = () => {
  const now = dayjs(); // 获取当前时间
  const threeDaysLater = now.add(3, 'day').endOf('day'); // 3天后的日期
  const timePoints: { index: number; value: string }[] = []; // 明确声明数组类型
  let currentTime = now.startOf('hour');
  
  // 如果当前时间不是00分或30分,则跳到下一个半小时整点
  if (currentTime.minute() !== 0 && currentTime.minute() !== 30) {
    if (currentTime.minute() < 30) {
      currentTime = currentTime.set('minute', 30);
    } else {
      currentTime = currentTime.add(1, 'hour').startOf('hour');
    }
  }
  
  // 循环生成每个半小时整点的时间点
  let index = 0;
  while (currentTime.isBefore(threeDaysLater) || currentTime.isSame(threeDaysLater)) {
    timePoints.push({
      index: index,
      value: currentTime.format('YYYY-MM-DD HH:mm')
    });
    currentTime = currentTime.add(30, 'minute'); 
    index++;
  }
  
  return timePoints;
};
// 获取每隔半小时的三天时间数组
export const getDeliveryTimeList = () => {
  const now = dayjs(); // 获取当前时间
  const threeDaysLater = now.add(3, 'day').endOf('day'); // 3天后的日期
  const timePoints: { index: number; value: string }[] = []; // 明确声明数组类型
  let currentTime = now;

  // 调整当前时间到最近的10分钟整点
  const minutes = currentTime.minute();
  const remainder = minutes % 10;
  if (remainder !== 0) {
    currentTime = currentTime.add(10 - remainder, 'minute');
  }

  // 循环生成每个10分钟整点的时间点
  let index = 0;
  while (currentTime.isBefore(threeDaysLater) || currentTime.isSame(threeDaysLater)) {
    timePoints.push({
      index: index,
      value: currentTime.format('YYYY-MM-DD HH:mm')
    });
    currentTime = currentTime.add(10, 'minute');
    index++;
  }

  return timePoints;
};

el-time-select:
并且禁用当前的时间选项

<el-form-item label="配货时间:" prop="dataData">
   <div class="flex">
       <el-date-picker :disabledDate="disabledDate" v-model="formData.dataData" type="date" placeholder="选择日期" class="!w-180px !mr-10px" />
       <el-time-select v-model="formData.dataTime" start='00:00' step='00:30' end='currentTime' placeholder="选择时间" class="!w-148px"/>
    </div>
</el-form-item>
import { disabledDate } from '@/utils/common'

const formData = ref({
  dataData: "",
  dataTime: "",
  deliveryType:1,
  deliveryFalg:0,
  remark:""
})
const currentTime = ref()
currentTime.value = getCurrentTime()

watch([() => formData.value.dataData, () => formData.value.dataTime], () => {
  if (formData.value.dataData && formData.value.dataTime) {
    const date = new Date(formData.value.dataData);
    const formattedDate = formatToDate(date);
    rowData.value.solDeliveryDateStr = formattedDate + ' ' + formData.value.dataTime
  }
})

const getCurrentTime= async () => { 
     const now = new Date();
     return padTime(now.getHours()) + ':' + padTime(now.getMinutes());
},
const padTime= async (value) => { 
    return value.toString().padStart(2, '0');
}
// 禁用今天之前的日期
export const disabledDate = (time) => {
  // 获取当前日期
  const today = new Date()
  // 将时间转换为日期格式
  const currentDate = new Date(today.getFullYear(), today.getMonth(), today.getDate())
  // 禁用早于当前日期的日期
  return time.getTime() < currentDate.getTime()
}

发现一个问题:上面代码当前时间超过2024-11-14 10::01,但是2024-11-14 10::00还是出来了

import dayjs from 'dayjs';

export const getDeliveryTimeList = () => {
  const now = dayjs(); // 获取当前时间
  const threeDaysLater = now.add(3, 'day').endOf('day'); // 3天后的日期
  const timePoints: { index: number; value: string }[] = []; // 明确声明数组类型
  let currentTime = now;

  // 如果当前时间不是00分或30分,则跳到下一个半小时整点
  if (currentTime.minute() !== 0 && currentTime.minute() !== 30) {
    if (currentTime.minute() < 30) {
      currentTime = currentTime.set('minute', 30).set('second', 0).set('millisecond', 0);
    } else {
      currentTime = currentTime.add(1, 'hour').startOf('hour');
    }
  }

  // 循环生成每个半小时整点的时间点
  let index = 0;
  while (currentTime.isBefore(threeDaysLater) || currentTime.isSame(threeDaysLater)) {
    timePoints.push({
      index: index,
      value: currentTime.format('YYYY-MM-DD HH:mm')
    });
    currentTime = currentTime.add(30, 'minute');
    index++;
  }

  return timePoints;
};

详细解释

  1. 获取当前时间:使用 dayjs() 获取当前时间。
  2. 计算三天后的日期:使用 add(3, ‘day’) 和 endOf(‘day’) 计算三天后的日期。
  3. 初始化时间点数组:声明一个空数组 timePoints 用于存储时间点。
  4. 调整当前时间为最近的半小时整点:
  5. 如果当前时间的分钟数不是0或30,则根据分钟数调整到最近的半小时整点。
  6. 如果当前时间的分钟数小于30,调整到当前小时的30分钟。
  7. 如果当前时间的分钟数大于等于30,调整到下一小时的00分钟。
  8. 初始化索引:初始化索引变量 index 为0。
  9. 循环生成时间点:
  10. 使用 while 循环,条件是当前时间在三天后之前或相等。
  11. 在每次循环中,将当前时间格式化并添加到 timePoints 数组中。
  12. 更新当前时间为下一个半小时。
  13. 索引加1。
  14. 返回时间点数组:循环结束后,返回生成的时间点数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值