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'; } }