时间常用计算,封装成工具 javaScript

902 阅读3分钟

公司项目里最近总是会用到,时间方面的一些计算 和时间范围的一些限制,导致会有冗余代码,所以为了方便使用就封装成了js小工具,供全局使用,直接上代码!(有问题还请指出,或者有更好的方法欢迎评论)

给选定的日期添加月数或者年数

/**
 * 给定选中的日期添加月数或者添加年数
 * @param {*} dateStr 已选中的日期
 * @param {*} num 要添加的月数/年数
 * @param {*} type 添加类型:1:添加月份;2:添加年份
 */
  static addDate(dateStr, num, type) {
  var str = ''
  str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
  // 创建日期对象,并初始化,完成文本转日期
  var date = new Date(str)
  var year = date.getFullYear() //年
  var month = date.getMonth() //月
  var day = date.getDate() //日

  if (type == '1') {
       month += num;
       day-=1;
  } else if (type == '2') {
      year = year + num
      day-=1
  }
  var date2 = new Date(year, month, day) //新的年月
  
  //从新生成的日期是取出月份
  month = date2.getMonth()+1;
  day = date2.getDate() //月
  if (day < 10) {
      day = '0' + day
  }
  if (month < 10) {
      month = '0' + month
  }
  str = date2.getFullYear() + '-' + month + '-' + day
  return str
}

给定选中的日期减去月数或者减去年数

/**
 * 给定选中的日期减去月数或者减去年数
 * @param {*} dateStr 已选中的日期
 * @param {*} num 要减去的月数/年数
 * @param {*} type 减去类型:1:减去月份;2:减去年份
 */
  static subDate(dateStr, num, type) {
  var str = ''
  str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
  // 创建日期对象,并初始化,完成文本转日期
  var date = new Date(str)
  var year = date.getFullYear() //年
  var month = date.getMonth() //月
  if (type == '1') {
      month = month - num + 1 //月 -num个月  因为js里month从0开始,所以要-1
      if (month < 0) {
          year--
          month += 12
      }
      if (month < 10) {
          month = '0' + month
      }
  } else if (type == '2') {
      year = year - num
      month += 1
  }
  var date2 = new Date(year, month, 0) //新的年月
  var day1 = date.getDate()
  var day2 = date2.getDate()
  if (day1 > day2) {
      //防止+6月后没有31天
      day1 = day2
  }
  if (day1 < 10) {
      day1 = '0' + day1
  }
  str = year + '-' + month + '-' + day1
  return str
}

添加天数

/**
 * 添加天数
 * @param {*} dateStr 要改变的时间字符串
 * @param {*} num 要添加的天数
 */
 static addDateDays(dateStr, num) {
      var str = ''
      str = dateStr.replace(/-/g, '/') // 转为格式"2015/05/26";
      // 创建日期对象,并初始化,完成文本转日期
      var date = new Date(str)
      date.setDate(date.getDate() + num)
      var year = date.getFullYear() //年
      var month = date.getMonth() + 1
      var day = date.getDate()
      // 如果时间选择2019-8月30 31 号 上学期结束时间是闰年 下学期开始时间是3月1号
 
      var cond1 = year % 4 == 0;  //条件1:年份必须要能被4整除
      var cond2 = year % 100 != 0;  //条件2:年份不能是整百数
      var cond3 = year % 400 ==0;  //条件3:年份是400的倍数
      //当条件1和条件2同时成立时,就肯定是闰年,所以条件1和条件2之间为“与”的关系。
      //如果条件1和条件2不能同时成立,但如果条件3能成立,则仍然是闰年。所以条件3与前2项为“或”的关系。
      //所以得出判断闰年的表达式:
      var cond = cond1 && cond2 || cond3;
      if (cond && month ==2 && day==29 ) {
      day =  date.getDate()+1
      }
      if (month < 10) {
          month = '0' + month
      }
      if (day < 10) {
          day = '0' + day
      }
  return date.getFullYear() + '-' + month + '-' + day
}

两个时间相差的月数

/**
 * @param {*} date1 大的时间
 * @param {*} date2 小的时间
 */
static differMonth(endData, startData) {
  var eData = new Date(endData)
  var sData = new Date(startData)
  var diffYearNum = eData.getFullYear() - sData.getFullYear()
  var diffMonthNum = eData.getMonth() - sData.getMonth()
  var diffDayNum = eData.getDate() - sData.getDate()
  return diffYearNum * 12 + diffMonthNum + (diffDayNum >= 0 ? 1 : 0)
}

根据两个日期,判断相差天数

/**
 * 根据两个日期,判断相差天数
 * @param sDate1 开始日期 如:2016-11-01
 * @param sDate2 结束日期 如:2016-11-02
 * @returns {number} 返回相差天数
 */
static differDays(sDate1, sDate2) {
  //Date.parse() 解析一个日期时间字符串,并返回1970/1/1 午夜距离该日期时间的毫秒数
  var time1 = Date.parse(new Date(sDate1))
  var time2 = Date.parse(new Date(sDate2))
  var nDays = Math.abs(parseInt((time2 - time1) / 1000 / 3600 / 24))
  return nDays
}

时间格式化

/**
* @param {*} fmt 转换格式
* @param {*} date 时间
*/
static dateFtt(fmt, date) {
 //author: meizz
 var o = {
     'M+': date.getMonth() + 1, //月份
     'd+': date.getDate(), //日
     'H+': date.getHours(), //小时
     'm+': date.getMinutes(), //分
     's+': date.getSeconds(), //秒
     'q+': Math.floor((date.getMonth() + 3) / 3), //季度
     S: date.getMilliseconds() //毫秒
 }
 if (/(y+)/.test(fmt))
     fmt = fmt.replace(
     RegExp.$1,
     (date.getFullYear() + '').substr(4 - RegExp.$1.length)
 )
 for (var k in o)
     if (new RegExp('(' + k + ')').test(fmt))
         fmt = fmt.replace(
         RegExp.$1,
         RegExp.$1.length == 1
         ? o[k]
         : ('00' + o[k]).substr(('' + o[k]).length)
     )
 return fmt
}