JS中Date对象的简单应用

148 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第18天,点击查看活动详情

在执行日期计算时如果用普通方法总感觉太麻烦而且容易错,所以就是Date对象来解决。不知道是不是我的错觉,总感觉JS中的Date对象功能比较差,比如求日期间隔。在Delphi中只需要把2个日期变量相减,并且可以自定义日期的显示方式。我今天使用,结果却报错,如何才能格式化日期呢,只能获取一遍年,再获取月,获取日,然后自己拼接,多麻烦啊。不像Delphi里的formatDateTime(很多年以前,我也曾写过dephi)

s := FormatDateTime('yy-mm-dd', Now); {返回: 07-12-19}

如果要是通过js去实现这个,我们大概率要写很长。但是在Delphi确实一个系统的函数,相信以后js也会有会有这种功能。

第一个:输入年月显示此月有多少天

这里其实有个小技巧,你把天指定为0,js就会指向最后一天,如果你把天指定为负数,就会到上个月某一天。

const daysOfMonth = (year,month)=>new Date(year,month,0).getDate()

第二个:输入年月日返回星期几

当时写这个函数的我就很奇怪,Month必须减1,估计是外国人的月是从0开始的?这应该是js的一个bug吧

const weekendsOfMonth = (Year,Month,Day)=>{
    0:'礼拜天',
    1:'礼拜一'2:'礼拜二',
    3:'礼拜三',
    4:'礼拜四',
    5:'礼拜五',
    6:'礼拜六',
}[new Date(Year,Month-1,Day).getDay()]    

第三个:输入年月日返回该日为当年的多少天

这个问题其实就是在本年中这一天之前有多少天,比如我输入2022-03-15,那我就是想知道在这一天之前,2022年过了多少天

这个稍微有点难度,因为要考虑闰年与平年,本来是打算判断闰年再加一,但是借用第一个问题的方法可以无需判断闰平年。

同时,需要一个循环来累加在输入日期之前的每个月的天数。

const dayCountOfDate =(year,month,day)=>{
let SumDay = 0
    if(month>1){
        for(i=1;i<month;i++){
              SumDay=SumDay+daysOfMonth(year,i);
         }
         return SumDay+day;
    } else {
     return day
    }
}

其中daysOfMonth函数是就是第一个函数

第四个:时间间隔

这个其实很简单了,就是时间戳相减,再取整数,我这里用来当前时间做对比,你也可以自己修改,或者当参数传入进去

const diffDate = (year,month,day)=>{
    const endDate=new Date(sYear,sMonth-1,sDay);
    const CurrDate=new Date();//当前系统日期
    return Math.floor(Math.abs(Date.parse(CurrDate)-Date.parse(endDate))/(1000*60*60*24))
}

第五个:日期有效性验证

当时再写这段代码的时候,还没一些库,因此就按照自己的理解写的,当然这是我一开始写js的时候的代码,现在回忆一下,那时候确实很菜。

const IsVaildDate1 = (year,month,day)=>{
    if(year<1900){
      return false
    }
    if(year>=1900){
        //年份合法
        if(month>=1 && month<=12){
            //月份合法
            if(month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12){ 
                if(date>=1 && date<=31){ return ture }
            } else if(month==4 || month==6 || month==9 || month==11){
                if(date>=1 && date<=30){ return ture }
            } else if(month ==2){
            if((year%4==0 && year%100!=0)||(year%400==0)){//闰年
		if(date>=1 && date<=29){ return true}
		else{
			if(date>=1 && date<=28){ return true }
            }
        }
    }
    return false
}

第二种方法,当你将错误的年月日组合,然后创建一个date对象时,这个日期其实不对的,比如你放入1月33日,他会自动转成2月2日.利用这种特性,我们可以判断你输入的日期是否合法。(PS.需先验证你输入的是数字型)

function IsVaildDate(sYear,sMonth,sDay){
    var IsDate=false;
    var date=new Date(sYear,sMonth-1,sDay);
    if (sYear==date.getFullYear()&&sMonth-1==date.getMonth()&&sDay==date.getDate()){
        IsDate=true;
    }
    return IsDate;
}

当然,时间已经过到2022了,我们完全可以使用dayjs 去解决上述问题