Vue+iView时间组件的使用

一,iView时间组件:DatePicker封装使用
官网参考:DatePicker属性

a,Date-picker封装为时间查询范围的组件:

<template>
  <span>
    <slot />
    <FormItem>
      <DatePicker
        v-model="condition.S_createTime_GTOE"
        confirm
        clearable
        placement="bottom"
        class="select-width"
        :type="type"
        :format="format"
        :options="pickerStart"
        transfer
        @on-change="onStartDateChange"
      ></DatePicker>
    </FormItem>
    <span class="search-label">至</span>
    <FormItem>
      <DatePicker
        v-model="condition.S_createTime_LTOE"
        confirm
        clearable
        placement="bottom"
        :type="type"
        :format="format"
        class="select-width"
        :options="pickerEnd"
        transfer
        @on-change="onEndDateChange"
      ></DatePicker>
    </FormItem>
  </span>
</template>

引入时间处理方法

import { convertUTCTimeToLocalTime } from "@/libs/tools";
/**
 * @param {Number} UTCDateString 传入的UTC时间格式
 */
export const convertUTCTimeToLocalTime = (UTCDateString, second) => {
  if(!UTCDateString){
    return '-';
  }
  function formatFunc(str) {    //格式化显示
    return str > 9 ? str : '0' + str
  }
  let date2 = new Date(UTCDateString);
  let year = date2.getFullYear();
  let mon = formatFunc(date2.getMonth() + 1);
  let day = formatFunc(date2.getDate());
  let hour = date2.getHours();

  hour = formatFunc(hour);
  let min = formatFunc(date2.getMinutes());
  let ss = formatFunc(date2.getSeconds())
  let dateStr = year+'-'+mon+'-'+day+' '+hour+':'+min + (second ? `:${ss}` : '');
  return dateStr;
}

组件方法

<script>

import { convertUTCTimeToLocalTime } from "@/libs/tools";
export default {
  props: {
    format: {
      type: String,
      default: "yyyy-MM-dd HH:mm:ss"
    },
    type: {
      type: String,
      default: "datetime"
    },
    defaultTime: {
      type: Boolean,
      default: true
    },
    searchField: {
      type: String,
      default: "createTime"
    }
  },
  data(){
    return {
      condition: {
        S_createTime_GTOE: "",
        S_createTime_LTOE: ""
      },
    }
  },
  methods: {
    getDefaultTime(end) {
      //返回当前时间和前一小时
      function format(str) {
        return str < 10 ? "0" + str : str;
      }
      let date = new Date();
      let year = date.getFullYear();
      let month = date.getMonth() + 1;
      let day = date.getDate();
      let time = end ? " 23:59:59" : " 00:00:00"
      return (
        year +
        "-" +
        format(month) +
        "-" +
        format(day) +
        time
      );
    },
    getDateSearch(){
      const defaultTime = this.defaultTime
      let valid = true;
      let { S_createTime_GTOE, S_createTime_LTOE } = this.condition
      if (S_createTime_GTOE && typeof S_createTime_GTOE === "object") {
        S_createTime_GTOE = convertUTCTimeToLocalTime(S_createTime_GTOE, true);
      }
      if (S_createTime_LTOE && typeof S_createTime_LTOE === "object") {
        S_createTime_LTOE = convertUTCTimeToLocalTime(S_createTime_LTOE, true);
      }
      if(defaultTime){
         if (!S_createTime_GTOE) {
          this.$Message.warning("查询起始时间不能为空");
          valid = false;
        } else if (!S_createTime_LTOE) {
          this.$Message.warning("查询结束时间不能为空");
          valid = false;
        } else if(S_createTime_LTOE < S_createTime_GTOE){
          this.$Message.warning("结束时间不能早于起始时间");
          valid = false;
        } /* else if(S_createTime_GTOE.split(' ')[0] != S_createTime_LTOE.split(' ')[0]){
          this.$Message.warning("起始和结束需为同一天");
          valid = false;
        } */
      }else{
        if(S_createTime_LTOE && (S_createTime_LTOE < S_createTime_GTOE)){
          this.$Message.warning("结束时间不能早于起始时间");
          valid = false;
        }
      }
     
      return {
        valid,
        [`S_${this.searchField}_GTOE`]: this.formatDateTime(S_createTime_GTOE),
        [`S_${this.searchField}_LTOE`]: this.formatDateTime(S_createTime_LTOE)
      }
    },

    formatDateTime(date){
      if(date){
        switch(this.format){
          case "yyyy-MM-dd":
            date = date.split(" ")[0]
            break;
          case "yyyy-MM-dd HH:mm:ss":
          default:
            break;
        }
      }
      return date
    },

    onStartDateChange(date) {
      this.condition.S_createTime_GTOE = date;
    },

    onEndDateChange(date) {
      if(date && date.split(" ")[1] === "00:00:00"){
        this.condition.S_createTime_LTOE = date.split(" ")[0] + " 23:59:59";
        return
      }
      this.condition.S_createTime_LTOE = date;
    },
    resetDateSearch(){
      if(this.defaultTime){
        this.condition.S_createTime_GTOE = this.getDefaultTime(),
        this.condition.S_createTime_LTOE = this.getDefaultTime('end')
      }else{
        this.condition.S_createTime_GTOE = ""
        this.condition.S_createTime_LTOE = ""
      }
    }
  },
  created(){
    this.resetDateSearch()
  }
  
}
</script>

b,页面中使用
引入组件

import Common from "_c/common.vue";
import DateSearchEnv from "_c/date-search-env";
export default {
  mixins: [Common],
  components: { DateSearchEnv},
  data() {}
  }

页面使用

<date-search-env ref="dateSearch">
          <span class="search-label">发送时间</span>
 </date-search-env>

页面获取参数

  let { valid, S_createTime_LTOE, S_createTime_GTOE } =this.$refs.dateSearch.getDateSearch();

c,效果
在这里插入图片描述

二,获取初始时间

获取初始时间
获取本月及上月
获取今天及昨天

a,/libs/tools.js中加

/**
 * @returns {date} 获取当月及上月
 */
 export const getNowMonth=()=>{
  var date = new Date(); 
  var nowY = date.getFullYear() + "-";
  var nowM =
  date.getMonth() + 1 < 10
    ? "0" + (date.getMonth() + 1)
    : date.getMonth() + 1;
  var getNowMonth=nowY+nowM;
  // var getBeforeMonth=nowY+date.getMonth();
  let getBeforeMonth="";
  if(nowM==1){
     getBeforeMonth= date.getFullYear()-1+ "-"+12;
  }else{
    getBeforeMonth=nowY+date.getMonth();
  }
  return [getBeforeMonth,getNowMonth]
}

/**
 * @returns {date} 获取今天及昨天
 */
export const getNowDate=()=>{
      var date = new Date(); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
      var nowY = date.getFullYear() + "-";
      var nowM =
        date.getMonth() + 1 < 10
          ? "0" + (date.getMonth() + 1) + "-"
          : date.getMonth() + 1 + "-";
      var nowDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
      var time = new Date().getTime() - 24 * 60 * 60 * 1000;
      var yesterday = new Date(time);
      var getToday = nowY + nowM + nowDate;
      var getyesterday = yesterday;
      return [getyesterday,getToday]
}

b,commponents/common.vue引入

import {
convertUTCTimeToLocalTime,
convertUTCTimeToDate,
convertUTCTimeToMonth,
convertUTCTimeToSecond, 
distanceMonth,
getTimestampToDate,
getTimestampToMonth,
getNowMonth,
getNowDate, 
numberValidator 
} from "@/libs/tools";

import axios from "@/libs/api.request.js";
    //初始月份(当月及上月)
    initMonth(){
      return getNowMonth();
    },
    //初始日期(今天及昨天)
    initDate(){
      return getNowDate();
    },

c,页面中引入使用

import Common from "_c/common";
import { convertUTCTimeToLocalTime, numberFixed } from "@/libs/tools";
export default {
  mixins: [Common],
  data() {
    return {
    }}
    }

d,效果

初始日期

  created() {
    this.condition.S_date_GTOE = this.initDate()[0];
    this.condition.S_date_LTOE = this.initDate()[1];
    }

在这里插入图片描述

初始月份

  created() {
        this.condition.S_month_GTOE=this.initMonth()[0]
        this.condition.S_month_LTOE=this.initMonth()[1]
        }

在这里插入图片描述

三,时间范围校验

a,/libs/tools.js中加

/**
 * @returns {Number} 月份间隔数
 */
export const  distanceMonth=(startTime,endTime)=>{
      startTime = new Date(startTime)
      endTime = new Date(endTime)
      var dateToMonth = 0
      var startDate=startTime.getDate() + startTime.getHours()/24 + startTime.getMinutes()/24/60;
      var endDate=endTime.getDate()  +endTime.getHours()/24 + endTime.getMinutes()/24/60;
      if(endDate >= startDate){
        dateToMonth = 0
      }else{
        dateToMonth = -1
      }
      let yearToMonth = (endTime.getYear() - startTime.getYear()) * 12
      let monthToMonth = endTime.getMonth() - startTime.getMonth()
      return yearToMonth + monthToMonth + dateToMonth
}

b,commponents/common.vue引入后封装

    //获取日期间隔月份
 getMonthsapart(startTime,endTime){
      return distanceMonth(startTime,endTime);
 },

c,页面中使用:

日期查询限制一个月内

    if (
        this.getMonthsapart(this.condition.S_date_GTOE,this.condition.S_date_LTOE)>0
      ) {
        return this.$Message.warning("起始和结束区间需为一个月");
      }

日期查询范围限制一个自然年内

      if(
        this.getMonthsapart(this.condition.S_month_GTOE,this.condition.S_month_LTOE)>12
        ){
         return  this.$Message.warning("起始和结束区间需为一年");
       }

d,其他校验

同年同月校验

    if(
       S_date_GTOE.split("-")[1] != S_date_LTOE.split("-")[1] ||
       S_date_GTOE.split("-")[0] != S_date_LTOE.split("-")[0]||
        ){
        return this.$Message.warning("起始和结束需为同年同月");
   }

同年校验

  if(
       this.condition.S_countMonth_GTOE.split('-')[0] != this.condition.S_countMonth_LTOE.split('-')[0]
        ){
        return  this.$Message.warning("起始和结束需为同一年");
   }

非空校验

 if (!this.condition.S_date_GTOE ) {
        this.$Message.error("开始时间不能为空");
        return;
 } 

顺序校验

 if (S_date_GTOE > S_date_LTOE) {
        return this.$Message.warning("结束时间不能早于起始时间");
  } 

四,时间格式化处理

(1)时区转换:

a,commponents/common.vue引入后封装

  //格式化日期
    timestampToDate(timestamp){
      return getTimestampToDate(timestamp);
    },
    //格式化月份
    timestampToMonth(timestamp){
      return getTimestampToMonth(timestamp);
    },

b,/libs/tools.js中加方法:

/**
 * @returns {date} 格式化日期
 */
export const getTimestampToDate=(timestamp)=> {
    var date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
    var Y = date.getFullYear() + "-";
    var M =
      date.getMonth() + 1 < 10
        ? "0" + (date.getMonth() + 1)
        : date.getMonth() + 1;

    var D = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();
    return Y + M + "-" + D;
}
/**
 * @returns {date} 格式化月份
 */
export const getTimestampToMonth=(timestamp)=> {
  var date = new Date(timestamp); //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  var Y = date.getFullYear() + "-";
  var M =
    date.getMonth() + 1 < 10
      ? "0" + (date.getMonth() + 1)
      : date.getMonth() + 1;
  return Y + M;
}

c,页面中使用:

日期

   S_date_GTOE = this.timestampToDate(S_date_GTOE);
   S_date_LTOE = this.timestampToDate(S_date_LTOE);

月份

 this.condition.S_month_GTOE = this.timestampToMonth(
            this.condition.S_month_GTOE
);
 this.condition.S_month_LTOE = this.timestampToMonth(
            this.condition.S_month_LTOE
  );

(2)时间截取显示

a,commponents/common.vue引入后封装

    //将UTC时间转换为当地时间
    getTranslateDate(date) {
      return convertUTCTimeToLocalTime(date);
    },
     getTranslateByDate(date) {
      return convertUTCTimeToDate(date);
    },
    getTranslateByMonth(date) {
      return convertUTCTimeToMonth(date);
    },
    getTranslateBySecond(date) {
      return convertUTCTimeToSecond(date);
    },

b,/libs/tools.js中加方法:

//时间到日期(年/月/日)
export const convertUTCTimeToDate = (UTCDateString) => {
  if(!UTCDateString){
    return '-';
  }
  function formatFunc(str) {    //格式化显示
    return str > 9 ? str : '0' + str
  }
  let date2 = new Date(UTCDateString);     //这步是关键
  let year = date2.getFullYear();
  let mon = formatFunc(date2.getMonth() + 1);
  let day = formatFunc(date2.getDate());
  let hour = date2.getHours();

  hour = formatFunc(hour);
  let min = formatFunc(date2.getMinutes());
  let second = formatFunc(date2.getSeconds());//获取秒
  //let dateStr = year+'-'+mon+'-'+day+' '+noon +' '+hour+':'+min;
  let dateStr = year+'-'+mon+'-'+day;
  return dateStr;
}

//时间到月(年/月)
export const convertUTCTimeToMonth = (UTCDateString) => {
  if(!UTCDateString){
    return '-';
  }
  function formatFunc(str) {    //格式化显示
    return str > 9 ? str : '0' + str
  }
  let date2 = new Date(UTCDateString);     //这步是关键
  let year = date2.getFullYear();
  let mon = formatFunc(date2.getMonth() + 1);
  let day = formatFunc(date2.getDate());
  let hour = date2.getHours();

  hour = formatFunc(hour);
  let min = formatFunc(date2.getMinutes());
  let second = formatFunc(date2.getSeconds());//获取秒
  //let dateStr = year+'-'+mon+'-'+day+' '+noon +' '+hour+':'+min;
  let dateStr = year+'-'+mon;
  return dateStr;
}
/**
 * @param {Number} UTCDateString 传入的UTC时间格式
 */
export const convertUTCTimeToLocalTime = (UTCDateString, second) => {
  if(!UTCDateString){
    return '-';
  }
  function formatFunc(str) {    //格式化显示
    return str > 9 ? str : '0' + str
  }
  let date2 = new Date(UTCDateString);     //这步是关键
  let year = date2.getFullYear();
  let mon = formatFunc(date2.getMonth() + 1);
  let day = formatFunc(date2.getDate());
  let hour = date2.getHours();

  hour = formatFunc(hour);
  let min = formatFunc(date2.getMinutes());
  let ss = formatFunc(date2.getSeconds())

  let dateStr = year+'-'+mon+'-'+day+' '+hour+':'+min + (second ? `:${ss}` : '');
  return dateStr;
}

//时间到秒(年/月/日 时:分:秒)
export const convertUTCTimeToSecond = (UTCDateString) => {
  if(!UTCDateString){
    return '-';
  }
  function formatFunc(str) {    //格式化显示
    return str > 9 ? str : '0' + str
  }
  let date2 = new Date(UTCDateString);     //这步是关键
  let year = date2.getFullYear();
  let mon = formatFunc(date2.getMonth() + 1);
  let day = formatFunc(date2.getDate());
  let hour = date2.getHours();

  hour = formatFunc(hour);
  let min = formatFunc(date2.getMinutes());
  let second = formatFunc(date2.getSeconds());//获取秒

  let dateStr = year+'-'+mon+'-'+day+' '+hour+':'+min+':'+second;
  return dateStr;
}

c,页面中使用

columns:[
 {
          title: "创建时间",
          align: "center",
          slot: "createTime",
        },
      ],
 <Table :columns="columns" :data="tableList" size="small" :row-class-name="rowClassName" @on-selection-change="getSelectItems">
        <template slot-scope="{row}" slot="weak">
          {{ row.weak ? "强" : "弱"}}
        </template>
        <template
          slot-scope="{ row}"
          slot="createTime"
        >{{getTranslateDate(row.createTime)}}</template>
  </Table>

d,效果图:
在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值