Source: date.js

/*
 对Date对象的操作
*/


/**
 * [dateToString description] 获取字符串形式的年月日,使用数组的join方法返回连接起来的字符串
 * @param date {Date} 需要转换成字符串格式的日期
 * @return {String} 字符串格式的日期
 */
function dateToString(date) {
  return [date.getFullYear(),
    (date.getMonth() + 1 < 10) ? '0' + (date.getMonth() + 1) : date.getMonth() + 1,
    (date.getDate() < 10) ? '0' + (date.getDate()) : date.getDate()
  ].join("-");
}

/**
 * [stringToDate description] 使字符串形式的日期返回为Date型的日期
 * @param str {String} 需要转换成日期格式的字符串
 * @return {Date} 日期
 */
function stringToDate(str) {
  const strArr = str.split('-');
  return new Date(strArr[0], strArr[1] - 1, strArr[2]);
}

/**
 * [formatDate description] 时间戳转换
 * @param date {Date}   Date对象
 * @param fmt {String}  转换格式
 * @return {String}  返回一个转换后的字符串
 */
function formatDate (date, fmt) {
  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;
}


/**
 * [genTimeStamp description] 生成一个随机数时间戳,来自:Coco
 * @return {String}  随机数时间戳
 */
function genTimeStamp() {
  var a = Math.random,
      b = parseInt;
  return Number(new Date()).toString() + b(10 * a()) + b(10 * a()) + b(10 * a());
}


/**
 * [timeAgo description] 时间转换,转换为'几分钟前'、'几个月前'、'几天前'这种,来自:http://caibaojian.com/timestamp.html
 * @param agoTimeStamp {Number}  之前的时间戳
 * @param nowTimeStamp {Number}  当前时间戳,默认为new Date().getTime()
 * @return {String}  返回一个转换后的字符串
 */
function timeAgo(agoTimeStamp, nowTimeStamp){
  var now = new Date().getTime() || nowTimeStamp;
  var minute = 1000 * 60;
  var hour = minute * 60;
  var day = hour * 24;
  var month = day * 30;
  var diffValue = now - agoTimeStamp;

  if(diffValue < 0){
    return false;
  }

  var monthC =diffValue/month;
  var weekC =diffValue/(7*day);
  var dayC =diffValue/day;
  var hourC =diffValue/hour;
  var minC =diffValue/minute;
  var result = '';

  if(monthC>=1){
    result="" + parseInt(monthC) + "个月前";
  }
  else if(weekC>=1){
    result="" + parseInt(weekC) + "周前";
  }
  else if(dayC>=1){
    result=""+ parseInt(dayC) +"天前";
  }
  else if(hourC>=1){
    result=""+ parseInt(hourC) +"小时前";
  }
  else if(minC>=1){
    result=""+ parseInt(minC) +"分钟前";
  }else{
    result="刚刚";
  }
  return result;
}

/**
 * [generateDaysArray description] 根据开始时间和结束时间,返回其间所有天组成的数组
 * @param start {String} 字符串格式的开始日期
 * @param end {String} 字符串格式的结束日期
 * @return {Array} 其间所有天组成的数组
 */
function generateDaysArray(start, end) {
  // 获取传入字符串形式参数的Date型日期
  const retArr = [];

  if (start && end) {

    if (start === end) { // TODO: 优化这部分逻辑
      retArr.push(dateToString(stringToDate(start)));
      return retArr;
    }

    var st = stringToDate(start);
    const et = stringToDate(end);

    // 获取开始日期的年,月,日
    const yyyy = st.getFullYear(),
      mm = st.getMonth();
    var dd = st.getDate();
    // 循环
    while (st.getTime() !== et.getTime()) {
      // 使用dd++进行天数的自增

      st = new Date(yyyy, mm, dd++);
      retArr.push(dateToString(st));
    }
  }
  return retArr;
}


/**
 * [getDateDiff description] 根据开始时间和结束时间,计算相差的天数
 * @param start {String} 字符串格式的开始日期->"YYYY-MM-DD"
 * @param end {String} 字符串格式的结束日期->"YYYY-MM-DD"
 * @return {Number} 相差天数
 */
function getDateDiff(start, end) {
  var  aDate,  oDate1,  oDate2,  iDays;
  aDate  =  start.split("-");
  oDate1  =  new  Date(aDate[1]  +  '-'  +  aDate[2]  +  '-'  +  aDate[0]); // 转换为12-18-2002格式
  aDate  =  end.split("-");
  oDate2  =  new  Date(aDate[1]  +  '-'  +  aDate[2]  +  '-'  +  aDate[0]);
  iDays  =  parseInt(Math.abs(oDate1  -  oDate2)  /  1000  /  60  /  60  /24); // 把相差的毫秒数转换为天数
  return  iDays + 1; // 需要将最后一天加上
}