JavaScript时间日期计算实践

计算相隔几年零几个月的完美算法
function getGap(start, end) {
  // 根据传入的时间格式自行处理
  var date1 = start.slice(0,10)
  var date2 = end.slice(0,10)

  // 拆分年月日
  date1 = date1.split('-')
  // 得到月数
  date1 = parseInt(date1[0]) * 12 + parseInt(date1[1])
  // 拆分年月日
  date2 = date2.split('-')
  // 得到月数
  date2 = parseInt(date2[0]) * 12 + parseInt(date2[1])

  // 总共相差多少个月。因为当年1月至当年12月会得到11个月,所以需要+1
  var totalMonth = Math.abs(date1 - date2) + 1

  // 得到相差的年数
  var year = parseInt(totalMonth / 12)
  // 计算完年年数,得到剩余的月数
  var month = totalMonth % 12

  year = year ? year + '年' : ''
  month = month ? month + '个月' : ''

  var res = `(${year}${month})`

  console.log(res)
}

var DateStart = "2016-01-01 00:00:00"
var DateEnd = "2016-12-01 00:00:00"

getGap(DateStart, DateEnd)
获取若干个月份的日历信息,包含星期
function getMonthDaysArray (year, month) {
  const WEEK_TABLE = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']

  // 返回结果
  const dayArrays = [];
  // 本月总天数
  const days = new Date(year, month, 0).getDate();
  // 本月第一天周几
  const thisMonthFirstDayInWeek = new Date(year, month - 1, 1).getDay();

  for (let i = 1; i <= days; i++) {
      let weekDayFlag = (thisMonthFirstDayInWeek + i - 1) % 7
      dayArrays.push(`${WEEK_TABLE[weekDayFlag]}${month}月${i}日`)
  };

  return dayArrays;
}

function getCalendar (countOfMonth) {
  const thisYear = new Date().getFullYear()
  const thisMonth = new Date().getMonth() + 1

  let res = []

  // 获取若干个月的日历信息
  for (let i = 0; i < countOfMonth; i++) {
    if (thisMonth + i < 13) {
      res = res.concat(getMonthDaysArray(thisYear, thisMonth + i))
    } else {
      res = res.concat( getMonthDaysArray(thisYear + 1, thisMonth + i - 12) )
    }
  }

  return res
}

console.log(getCalendar(12))["周三4月1日", "周四4月2日", "周五4月3日", "周六4月4日", "周日4月5日", "周一4月6日", "周二4月7日", "周三4月8日", "周四4月9日", "周五4月10日", "周六4月11日", "周日4月12日", "周一4月13日", "周二4月14日", "周三4月15日", "周四4月16日", "周五4月17日", "周六4月18日", "周日4月19日", "周一4月20日", "周二4月21日", "周三4月22日", "周四4月23日", "周五4月24日", "周六4月25日", "周日4月26日", "周一4月27日", "周二4月28日", "周三4月29日", "周四4月30日", "周五5月1日", "周六5月2日", "周日5月3日", "周一5月4日", "周二5月5日", "周三5月6日", "周四5月7日", "周五5月8日", "周六5月9日", "周日5月10日", "周一5月11日", "周二5月12日", "周三5月13日", "周四5月14日", "周五5月15日", "周六5月16日", "周日5月17日", "周一5月18日", "周二5月19日", "周三5月20日", "周四5月21日", "周五5月22日", "周六5月23日", "周日5月24日", "周一5月25日", "周二5月26日", "周三5月27日", "周四5月28日", "周五5月29日", "周六5月30日", "周日5月31日", "周一6月1日", "周二6月2日", "周三6月3日", "周四6月4日", "周五6月5日", "周六6月6日", "周日6月7日", "周一6月8日", "周二6月9日", "周三6月10日", "周四6月11日", "周五6月12日", "周六6月13日", "周日6月14日", "周一6月15日", "周二6月16日", "周三6月17日", "周四6月18日", "周五6月19日", "周六6月20日", "周日6月21日", "周一6月22日", "周二6月23日", "周三6月24日", "周四6月25日", "周五6月26日", "周六6月27日", "周日6月28日", "周一6月29日", "周二6月30日", "周三7月1日", "周四7月2日", "周五7月3日", "周六7月4日", "周日7月5日", "周一7月6日", "周二7月7日", "周三7月8日", "周四7月9日", …]
 (待完善)输出格式优美的日历表  参见https://segmentfault.com/a/1190000012112639
var date = new Date();
//当前是哪一年
var year = date.getFullYear();
//当前是哪个月,注意这里的月是从0开始计数的
var month = date.getMonth();

//当前月的第一天的日期
var firstDay = new Date(year,month,1);
//第一天是星期几
var weekday = firstDay.getDay();

//求当前月一共有多少天
//new Date(year,month+1,0) : month+1是下一个月,day为0代表的是上一个月的最后一天,即我们所需的当前月的最后一天。
//getDate()则返回这个日期对象是一个月中的第几天,我们由最后一天得知这个月一共有多少天
var days = new Date(year,month+1,0).getDate();

var res = "";
//输出第一天之前的空格
for(var i=0;i<weekday;i++){
    res+="  ";
}

for(var j=1;j<=days ;j++){
    res += j+" ";
    weekday++;

    //如果是周日则换行
    if(weekday%7 == 0){
           weekday = 0;
           res += '\n';
    }
}

 

posted on 2019-07-02 13:58  dawnxuuu  阅读(333)  评论(0编辑  收藏  举报

导航