(记录) 封装一个日期函数,可以传3个参,复用性高,可直接用

朋友写的,我改动了一下下,我是菜鸡,里面写了很多注释,还有很多行代码理解不了,有两个版本,一个是直接放函数的,另外一个是我理解他写的代码写了注释

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>日期函数</title>
</head>
<body>
    <script>
 const getBeforeDate=(vis=null,type=null,n=null)=>{
    //vis:1:当前月,>1:之后的月份,<=0:当月之前的月份 
    //type:0:取当前月的第一天与最后一天,>0:之后的月份,<0:当月之前的月份
    //n为你要传入的参数,当前为0,前一天为-1,后一天为1
    //注:当前type跟(vis,n)不可同时出现,如有其他需求,可根据需求更改
    let date = new Date() ;
    let year,month,day ;
    year = date.getFullYear();
    // console.log(year,"year");//2022
    if(getCom(n)) date.setDate(date.getDate()+n);//如果n有值,则获取前一天后一天,没有则不执行
    if(getCom(vis)) month =date.getMonth()+vis//存在vis,则取某月份的前一天后一天
    else month =date.getMonth()+1
    if(month==0){
      month = 12;
      year = year-1;
    }
    if(month==-1){
      month = 11;
      year = year-1;
    }
    // 可继续往前加
    let myDate = new Date(year,month,0);//只用于存在type以及存在n的时候且为2月份的时候
    // console.log(myDate,"myDate");
    if(getCom(vis) || getCom(n)){
      // 如果不注释这里的话,只要第一个参 月份为2 ,就会显示2月份的最后一天,另外两个参怎么改都没用,获取不到2月的别的日期了
    //   if(month==2){
    //   day=myDate.getDate()
    //  }
    //  else day = date.getDate() ;
      day = date.getDate() ;  //这样就可以正常获取2月的日期了
     let s = year + '-' + ( month < 10 ? ( '0' + month ) : month ) + '-' + ( day < 10 ? ( '0' + day ) : day) ;
     console.log(">>>>>>>>>>>sss",s)
     return s ;
    }
    if(getCom(type)){
     if(month<10) month = type+month;
     var startDate = year+'-'+month+'-01'; //上个月第一天
     if(month==2){
      var endDate = year+'-'+month+'-'+( myDate.getDate()-2);// 28号是最后一天
     }
   else  if(month==3 || month==7 || month==8 || month==10 || month==12){
      var endDate = year+'-'+month+'-'+( myDate.getDate()+1);//31号是最后一天
     }
     else {
       var endDate = year+'-'+month+'-'+myDate.getDate();//上个月最后一天
     }
     console.log(">>>>>>拿月份的第一天和最后一天",startDate,endDate)
     return {
      startDate,
      endDate
     }
    }
   }
  const getCom=(data)=>{
    if(Object.prototype.toString.call(data) == '[object Null]' || Object.prototype.toString.call(data) == '[object Undefined]'){

     return false
    }
    else{
     return true
    }
   }

   console.log(getBeforeDate(-4,null,null),"2222");
    </script>
</body>
</html>

有注释版本:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>日期函数</title>
</head>
<body>
    <script>
    //   简约的版本,传一个参,0是今天
    //   function getBeforeDate(n){//n为你要传入的参数,当前为0,前一天为-1,后一天为1
    //   var date = new Date() ;
    //   var year,month,day ;
    //   date.setDate(date.getDate()+n);
    //   year = date.getFullYear();
    //   month = date.getMonth()+1;
    //   day = date.getDate() ;
    //   s = year + '-' + ( month < 10 ? ( '0' + month ) : month ) + '-' + ( day < 10 ? ( '0' + day ) : day) ;
    //   return s ;
    // }
    // console.log(getBeforeDate(-30));

    // 如果要暴露出去别的页面用的话,前面加一个 export  ,export const getBeforeDate=XXX
    // 用的页面 import {getBeforeDate} from '../../utils/seven/begindateformat'
    // 用   BeginTime:getBeforeDate(-4,null,null),
 const getBeforeDate=(vis=null,type=null,n=null)=>{
    //vis:1:当前月,>1:之后的月份,<=0:当月之前的月份 
    //type:0:取当前月的第一天与最后一天,>0:之后的月份,<0:当月之前的月份
    //n为你要传入的参数,当前为0,前一天为-1,后一天为1
    //注:当前type跟(vis,n)不可同时出现,如有其他需求,可根据需求更改
    let date = new Date() ;
    let year,month,day ;
    year = date.getFullYear();
    // console.log(year,"year");//2022
    if(getCom(n)) date.setDate(date.getDate()+n);//如果n有值,则获取前一天后一天,没有则不执行
    if(getCom(vis)) month =date.getMonth()+vis//存在vis,则取某月份的前一天后一天
    else month =date.getMonth()+1
    if(month==0){
      month = 12;
      year = year-1;
    }
    if(month==-1){
      month = 11;
      year = year-1;
    }
    // 可继续往前加
    let myDate = new Date(year,month,0);//只用于存在type以及存在n的时候且为2月份的时候
    // console.log(myDate,"myDate");
    if(getCom(vis) || getCom(n)){
      // 如果不注释这里的话,只要第一个参 月份为2 ,就会显示2月份的最后一天,另外两个参怎么改都没用,获取不到2月的别的日期了
    //   if(month==2){
    //   day=myDate.getDate()
    //  }
    //  else day = date.getDate() ;
      day = date.getDate() ;  //这样就可以正常获取2月的日期了
     let s = year + '-' + ( month < 10 ? ( '0' + month ) : month ) + '-' + ( day < 10 ? ( '0' + day ) : day) ;
     console.log(">>>>>>>>>>>sss",s)
     return s ;
    }
    if(getCom(type)){
      // 第二个参是type,不管传入几月份,最后一天都是30号,这个时候就会有问题了,比如2月份的时候,最后一天是28号,而 3 7 8 10 12月的最后一天都是31号。然后这两种情况加个判断,当月份为2的时候,-2天,就是28了,其他几个有31号的,+1天
     if(month<10) month = type+month;
     var startDate = year+'-'+month+'-01'; //上个月第一天
     if(month==2){
      var endDate = year+'-'+month+'-'+( myDate.getDate()-2);// 28号是最后一天
     }
   else  if(month==3 || month==7 || month==8 || month==10 || month==12){
      var endDate = year+'-'+month+'-'+( myDate.getDate()+1);//31号是最后一天
     }
     else {
       var endDate = year+'-'+month+'-'+myDate.getDate();//上个月最后一天
     }
     console.log(">>>>>>拿月份的第一天和最后一天",startDate,endDate)
     return {
      startDate,
      endDate
     }
    }
   }
/**
 * Object.prototype.toString.call() 这个方法是用来判断数组类型的,因为一般判断就会返回一个obj  -  对象 
 * 然后这个方法,其实就是在判断data的数据,是不是为null 或者undefined 是的话就返回false 否则就返回 true
 * 我们js的数据类型一般 比较简单,基本就是 number string undefined 和 boolean 五种
 * 如果用我们一般的类型去判断,不能判断复杂的类型,比如 object ,此时就可以 用Object.prototype.toString.call() 方法
 */
// data 是谁
  const getCom=(data)=>{
    if(Object.prototype.toString.call(data) == '[object Null]' || Object.prototype.toString.call(data) == '[object Undefined]'){
// console.log(Object.prototype.toString.call(data) == '[object Null]' || Object.prototype.toString.call(data) == '[object Undefined]',6666);
console.log(data,"data1");
console.log(Object.prototype.toString.call(data),"发发发");//[object Null]
     return false
    }
    else{
      console.log(data,"data2");//-2
      // console.log(Object.prototype.toString.call(data) == '[object Null]' || Object.prototype.toString.call(data) == '[object Undefined]',8888);
     return true
    }
   }
   //vis:1:当前月,>1:之后的月份,<=0:当月之前的月份
   //type:0:取当前月的第一天与最后一天,>0:之后的月份,<0:当月之前的月份
   //n为你要传入的参数,当前为0,前一天为-1,后一天为1 
   //注:当前type跟(vis,n)不可同时出现,如有其他需求,可根据需求更改
  //  console.log(getBeforeDate(null,-2,null),"11111");// if 3个data1 null, data2 -2,走else
  //  console.log(getBeforeDate(0,null,1),"2222");// 三个data2 1 0 0 走if
   console.log(getBeforeDate(-4,null,null),"2222");// 三个data2 1 0 0 走if
  // 第一个参 - 月份 -3 的话就是去年的12月,如果再-4,就会出问题,等会加
    </script>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值