Vue常用日期时间方法(复杂日期间隔、当年天数等等)

一、获取日期和年份之间的关系

此方法不完善,后续工作中没有用过,也就没再去弄了

/** *
 * 理解方式:
 * (1)计算某一年份和某一日期间隔多少天(两个参数都必须正确传入);
 * (2)计算当前日期在当年第多少天(两个参数都可不传);
 * (3)某一年份距离当前日期多少天(第一个参数需要传null 或者 false,第二个正确传入年份)
 * (4)某一日期在当年的第多少天(第一个参数传入正确日期,第二个不传)
 * @param {*日期} date, 传入的日期,不传则使用当前日期
 * @param {*年份} year, 传入的年份,不传则使用当前年份
 * PS:如果传入日期的年份大于传入的年份,则是年份距离日期多少天,否则是传入日期距离年份多少天
 **/
// 拓展(未做):
// 1.第一个传日期,第二个不传:传入日期距当前日期间隔天数(与上面第四点冲突)
// 2.第一个传日期,第二个也传日期:两个日期间隔多少天(如果做了,第三个方法也可再简化一点)
// 3.第一个传数字年份,第二个不传:当前日期距离传入年份多少天
// 4.第一个传数字年份,第二个传日期:也是同第3点一样
// 5.第一个传数字年份,第二个也传数字年份:两个年份之间的总天数
// 6.第一个传null或者false,第二个传日期:new Date() 的日期和传入日期间隔多少天
format.getDayOfYear = function (date, year) {
  const nowDate = date && new Date(date).getFullYear() && new Date(date).getFullYear() !== 1970 ? new Date(date) : new Date()
  let dateYear = nowDate.getFullYear()
  year = year || dateYear
  let num = 0
  // 处理传入日期在传入日期年份第多少天
  const m = nowDate.getMonth()
  const d = nowDate.getDate()
  // 循环累加天数
  for (let i = 0; i <= m; i++) {
    let day = new Date(dateYear, i, 0).getDate()
    num += i === m ? d : day
  }
  // 如果传入日期的年份大于传入的年份,则是年份距离日期多少天
  if (dateYear >= year) {
    for (let y = year; y < dateYear; y++) {
      num += ((y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0)) ? 366 : 365
    }
  } else {
    // 否则是传入日期距离年份多少天
    let moreDay = 0
    for (let y = dateYear; y < year; y++) {
      moreDay += ((y % 4 === 0 && y % 100 !== 0) || (y % 400 === 0)) ? 366 : 365
    }
    num = moreDay - num
  }
  return num
}

二、获取两个年份之间所有年的总:月数和天数,每月的天数,每年的天数

/**
 * 获取两个年份之间所有年的总:月数和天数,每月的天数,每年的天数
 * @param {*年份1} year1 不传则默认当年
 * @param {*年份2} year2 非必传
 * @param {*所有的月和天数据} list,默认[]
 * @param {*按年份的月和天数据} listPage,默认{}
 * @param {*总共多少年} years
 * @param {*总共多少月} months,默认0
 * @param {*每年多少天和总天数} days,默认0
 */
format.getDateBetween = function (year1, year2) {
  // 处理年份
  year1 = (year1 || new Date().getFullYear()) * 1
  year2 = year2 ? year2 * 1 : year1
  // 处理年份的大小顺序
  let newYear = year1
  if (year1 > year2) {
    year1 = year2
    year2 = newYear
  }
  // 获取所有月,日
  let result = {
    list: [],
    listPage: {},
    years: year2 - year1 + 1,
    months: 0,
    days: { count: 0 }
  }
  // 循环得到需要的信息
  for (let i = year1; i <= year2; i++) {
    result.listPage[i] = []
    result.days[i] = 0
    for (let m = 1; m <= 12; m++) {
      let date = new Date(i, m, 0).getDate()
      result.list.push({ month: m, day: date })
      result.listPage[i].push({ month: m, day: date })
      result.days[i] += date
      result.days.count += date
    }
    result.months += 12
  }
  return result
}

三、计算两个日期之间的天数、两个日期各自在当年第多少天、及其两年之间的总天数,基于以上第一个方法

此方法需要用到上述第一个方法

/**
 * 计算两个日期之间的天数、两个日期各自在当年第多少天、及其两年之间的总天数,
 * @param {*日期1} date1
 * @param {*日期2} date2
 * @param {*日期之间的天数} dayNum,默认0
 * @param {*开始日期在当年第多少天} startNum,默认0
 * @param {*结束日期在当年第多少天} endNum,默认0
 * @param {*总天数} alldays,默认0,上面第二个方法也有计算总天数,看情况选择
 */
format.computedYearDay = function (date1, date2) {
  let dayObj = { dayNum: 0, startNum: 0, endNum: 0, alldays: 0 }
  if (date1 && date2) {
    // 重新设置日期大小顺序
    const newYear = date1
    if (date1.localeCompare(date2) === 1) {
      date1 = date2
      date2 = newYear
    }
    const ksYears = new Date(date1).getFullYear()
    const jsYears = new Date(date2).getFullYear()
    // 两年之间的总天数
    let alldays = 0
    // 结束年份总天数
    let jsDays = ((jsYears % 4 === 0 && jsYears % 100 !== 0) || (jsYears % 400 === 0)) ? 366 : 365
    for (let i = ksYears; i <= jsYears; i++) {
      alldays += ((i % 4 === 0 && i % 100 !== 0) || (i % 400 === 0)) ? 366 : 365
    }
    // 分别获取两个日期在当年第多少天
    const startNum = format.getDayOfYear(date1)
    const endNum = format.getDayOfYear(date2)
    // 计算间隔多少天
    let dayNum = alldays - (jsDays - endNum + startNum)
    dayObj = { dayNum, startNum, endNum, alldays: alldays }
  }
  return dayObj
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值