JS中关于内置对象-------Date类型的一个小程序,个人出错和调试

Date:

什么是: 专门封装一个时间,并提供操作事件的API
何时: 今后只要保存和操作时间
如何: 
 创建: 4种: 
  1. 创建日期对象,同时获得当前系统时间: 
     var now=new Date();
     强调: 获取的是客户端本地时间
  2. 创建日期对象,封装自定义时间
     var date=new Date("yyyy/MM/dd hh:mm:ss");
              new Date(yyyy,MM-1,dd,hh,mm,ss);
  3. 使用毫秒数创建: 
     var date=new Date(ms); //ms转换当地时区时间
   何时: 今后服务器上存储时间都是用毫秒数
        因为不用考虑时区问题
        客户端就需要用new Date将毫秒数转为当地时区对应的时间显示。
  4. 复制一个日期: 
     var date1=new Date("xxx");
     var date2=new Date(date1);
   何时: 因为日期的计算都是直接修改原日期对象
        所以旧时间无法保留
        如果希望同时保留计算前后的两个时间时
        就必须先将原日期复制一个副本,再用副本计算
原理: 其实日期对象中保存的是一个毫秒数
     从1970年1月1日0点至今
        //获取当前时间距离1970/1/1日的毫秒数
        console.log(now.getTime());
        
        //计算机中最大的数值:
        console.log(Number.MAX_VALUE);

API: 
 单位: FullYear  Month  Date  Day
      Hours   Minutes  Seconds  Milliseconds
 1. 每个单位都有一对儿getXXX/setXXX方法
     其中: getXXX() 负责获取指定单位的值
          setXXX(n) 负责设置指定单位的新值
            setXXX(n)可自动根据n调整进制
   比如: getDate()  setDate(n)
    特例: Day没有setDay()方法,星期不允许修改
 2. 取值范围: 月中的日(date) 从1~31结束,
           其余都是从0开始到进制-1结束: 
   Month: 0~11 比现实少1
   Date: 1~31 
   Day: 0~6 
   hours: 0~23
   minutes/seconds: 0~59
计算: 2种:
 1. 两日期对象可直接相减,结果是毫秒差
   何时: 计算倒计时
 2. 对一个日期的任意单位做加减:
   3步: 1.取值, 2.计算, 3.放回去
     其实可简化为: date.setXXX(date.getXXX()+n)
日期的格式化: 
 date.toString() 将日期转为当地时间的完整格式
 date.toLocaleString() 将日期转为当地时间的简化格式
 date.toLocaleDateString() 仅保留日期部分
 date.toLocaleTimeString() 仅保留时间部分
 date.toGMTString(); 将当地时间转为0时区标准时间

以下是自己尝试写的关于续签合同日期计算的小程序:

            //创建日期对象hiredate:2018/9/30
			var hiredate=new Date("2018/9/30");
			//复制hiredate到到期时间enddate中
			var enddate=new Date(hiredate);
			//将enddate+3年
			enddate=enddate.setFullYear(enddate.getFullYear()+3);
			//复制enddate到续签时间renewdate
			var renewdate=new Date(enddate);
			//将renewdate-1月
			renewdate=renewdate.setMonth(renewdate.getMonth()-1);
			//如果renewdate是周六
			if(renewdate.getDay()==6){
				//renewdate-1天
				renewdate=renewdate.setDate(renewdate.getDate()-1);
				}
			//否则,如果renewdate是周日
			else if(renewdate.getDay()==0){
			//renewdate-2天
				renewdate=renewdate.setDate(renewdate.getDate()-2);
				}
			//复制renewdate到提醒时间alertdate
			var alertdate=new Date(renewdate);
			//将alertdate-7天
			alertdate=alertdate.setDate(alertdate.getDate()-7);
			console.log(
				"到期时间:"+enddate,
				"续签时间:"+renewdate,
				"提醒时间:"+alertdate
			);

运行时报错:

JS中关于内置对象-------Date类型的一个小程序,个人出错和调试

经过一番调试,终于发现问题所在,setMonth之类的date对象的API返回值不是date对象,所以再将其赋给renewdate时,数据类型发生变化。所以在if判断条件中会报错getDay()不是一个函数,因为这里renewdate已经不是date对象。

           //创建日期对象hiredate:2018/9/30
			var hiredate=new Date("2018/9/30");
			//复制hiredate到到期时间enddate中
			var enddate=new Date(hiredate);
			//将enddate+3年
			enddate.setFullYear(enddate.getFullYear()+3);
			//复制enddate到续签时间renewdate
			var renewdate=new Date(enddate);
			//将renewdate-1月
			renewdate.setMonth(renewdate.getMonth()-1);
			//如果renewdate是周六
			if(renewdate.getDay()==6){
				//renewdate-1天
				renewdate.setDate(renewdate.getDate()-1);
				}
			//否则,如果renewdate是周日
			else if(renewdate.getDay()==0){
			//renewdate-2天
				renewdate.setDate(renewdate.getDate()-2);
				}
			//复制renewdate到提醒时间alertdate
			var alertdate=new Date(renewdate);
			//将alertdate-7天
			alertdate.setDate(alertdate.getDate()-7);
			console.log(
				"到期时间:"+enddate,
				"续签时间:"+renewdate,
				"提醒时间:"+alertdate
			);

执行结果如下:

JS中关于内置对象-------Date类型的一个小程序,个人出错和调试

希望我的问题能给大家带来帮助。