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