/////////////////////////////////////////////////////////////////////
//Number对象 Object.defineProperty 增加额外的函数方法
// 在app.js 中增加require即可
/////////////////////////////////////////////////////////////////////   
// 添加秒数
Date.prototype.addSeconds = function (count) {
  var time = this.getTime();
  time += count * 1000;
  return new Date(time);
}

// 添加分钟
Date.prototype.addMinutes = function (count) {
  return this.addSeconds(count * 60);
}

// 添加小时
Date.prototype.addHours = function (count) {
  return this.addMinutes(count * 60);
}

// 添加天数
Date.prototype.addDays = function (count) {
  return this.addHours(count * 24);
}

// 添加月份
Date.prototype.addMonths = function (count) {
  var year = this.getFullYear();
  var month = this.getMonth();
  var date = this.getDate();
  // 计算年份
  year += Math.floor((month + count) / 12);
  // 计算月份
  month = Math.floor((month + count) % 12);
  if (month <= 0) {
    month += 12;
  }
  // 计算天数
  var dateMax = new Date(`${year}/${month + 1}/0`).getDate();
  if (date > dateMax) {
    date = dateMax
  }
  return new Date(year, month, date, this.getHours(), this.getMinutes(), this.getSeconds());
}

// 添加年份
Date.prototype.addYears = function (count) {
  return this.addMonths(count * 12);
}

// 计算两个日期数据，相隔的天数
Date.prototype.dayDiff = function (date) {
  if (!date) {
    return 0;
  }
  var time = this.getTime();
  var dateTime = date.getTime();
  var timeDiff = time - dateTime;
  var dayDiff = timeDiff / (1000 * 60 * 60 * 24);
  return dayDiff;
}

// 判断日期是否是今天
Date.prototype.isToday = function (str) {
  let d = new Date(str).setHours(0, 0, 0, 0);
  let today = new Date().setHours(0, 0, 0, 0);

  let obj = {
    '-86400000': '昨天',
    0: '今天',
    86400000: '明天',
  };
  return obj[d - today] || false;
}

//名称：日期加法函数
//参数：time(日期字符串，示例：12:00:00)
//返回：Date对象
Date.prototype.addTime = function (time) {
  var timeRegex = /^([0-1]?\d|2[0-3])(:[0-5]?\d){1,2}$/g;
  if (timeRegex.test(time)) {
    var value = Date.parse("1970/1/1 " + time) - Date.parse("1970/1/1");
    this.setMilliseconds(this.getMilliseconds() + value);
  }
  return this;
};

/**
 * 返回下个月的第一天的Date对象
 */
Date.prototype.getStartOfNextMonth = function () {
  var newDate = new Date(this);
  newDate.setDate(15); //确保月数不会进位
  newDate.setMonth(this.getMonth() + 1);
  newDate.setDate(1);
  return newDate;
}

/**
 * 返回下个月的最后一天的Date对象
 */
Date.prototype.getEndOfNextMonth = function () {
  var newDate = new Date(this);
  newDate.setDate(15); //确保月数不会进位
  newDate.setMonth(this.getMonth() + 2); //加两个月
  newDate.setDate(0); //再退回上个月的最后一天
  return newDate;
}

// 返回格式化的日期字符串，默认yyyy-MM-dd格式
// yyyy：4位数的年份
// MM：2位数的月份
// dd：2位数的日
// HH：2位数的小时数，按24小时制
// mm：2位数的分钟数
// ss：2位数的秒钟数
// ww：星期数
// w：星期数（简）
Date.prototype.format = function (fmt) {
  console.log("Date.prototype.format",fmt);
  fmt = fmt || 'yyyy-MM-dd';
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length))
  }

  if (this.getFullYear() <= 1900) {
    return '';
  }

  let keys = {
    'yyyy': this.getFullYear(),
    'MM': this.getMonth() + 1,
    'dd': this.getDate(),
    'HH': this.getHours(),
    'mm': this.getMinutes(),
    'ss': this.getSeconds(),
    'ww': ['周日', '周一', '周二', '周三', '周四', '周五', '周六'][this.getDay()],
    'w': ['日', '一', '二', '三', '四', '五', '六'][this.getDay()]
  }
  for (let key in keys) {
    if (new RegExp(`(${key})`).test(fmt)) {
      let value = keys[key] < 10 ? ('0' + keys[key]) : keys[key];
      fmt = fmt.replace(RegExp.$1, value)
    }
  }
  return fmt
}

// 判断是否当天，若是当天则返回[时:分]，若不是当天则返回[月-日]
Date.prototype.toSmartString = function () {
  let time = this;
  // console.log('time', time);
  if (!time)
    return '';

  var year = time.getFullYear();
  var month = time.getMonth() + 1;
  var date = time.getDate();
  var hour = time.getHours();
  var minute = time.getMinutes();

  var now = new Date();
  var nowYear = now.getFullYear();
  var nowMonth = now.getMonth() + 1;
  var nowDate = now.getDate();

  if (nowYear == year && nowMonth == month && nowDate == date) {
    return `${hour.padStart(2, '0')}:${minute.padStart(2, '0')}`; // 对Number类型扩展了padStart函数，不满2位数的自动补齐
  } else if (nowYear == year) {
    return `${month.padStart(2, '0')}-${date.padStart(2, '0')}`;
  } else {
    return `${year.padStart(4, '0')}-${month.padStart(2, '0')}-${date.padStart(2, '0')}`;
  }
}

/**
 * @desc   : 获取当前时间，格式YYYY-MM-DD
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toDateStr = function () {
  return this.format('yyyy-MM-dd')
}

/**
 * @desc   : 获取当前时间，格式HH:mi:ss
 * @author : 周兴
 * @date   : 2022/11/16 11:02
 */
Date.prototype.toTimeStr = function () {
  return this.format('hh:mm:ss')
}

/**
 * @desc   : 获取当前日期，格式YYYY-MM-DD hh:mm:ss
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toDateTimeStr = function () {
  return this.format('yyyy-MM-dd hh:mm:ss')
}

/**
 * @desc   : 获取当前年月
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toYearMonth = function () {
  return this.format('yyyyMM')
}

/**
 * @desc   : 获取当前年月
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toYear = function () {
  return this.format('yyyy')
}

/**
 * @desc   : 获取当前年月
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toYearMonth2 = function () {
  return this.format('yyyy-MM')
}

/**
 * @desc   : 获取当前天
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.toDay = function () {
  return this.format('dd')
}

/**
 * @desc   : 获得星期
 * @author : 周兴
 * @date   : 2022/11/16 17:16
 */
Date.prototype.getWeek = function () {
  let days = this.getDay()
  let weekArray = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
  return weekArray[days];
}

/**
 * @desc   : 获得本周一日期
 * @author : 周兴
 * @date   : 2022/11/16 17:16
 */
Date.prototype.getWeekFirstDay = function () {
  let days = this.getDay()
  days = days === 0 ? 6 : days - 1;
  return this.addDays(-1 * days).toDateStr();
}

/**
 * @desc   : 获得本周周末的日期
 * @author : 周兴
 * @date   : 2022/11/16 17:16
 */
Date.prototype.getWeekLastDay = function () {
  let days = this.getDay()
  days = days === 0 ? 1 : 7 - days;
  return this.addDays( days).toDateStr();
}

/**
 * @desc   : 获取当前月份的第一天
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.getFirstDateStr = function () {
  return new Date(this.toYearMonth2() + '-01').toDateStr()
}

/**
 * @desc   : 获取当前月份的最后一天
 * @author : 周兴
 * @date   : 2022/11/16 10:59
 */
Date.prototype.getLastDateStr = function () {
  let year = this.getFullYear();
  let month =  String(this.getMonth() + 1).padStart(2, '0')
  let day = new Date(year, month, 0).getDate();
  return year + '-' + month + '-' + day;
}


