js日期工具类,兼容ios

/* js 日期工具类 */

/**
 * 时间戳、日期、字符串格式化,并返回指定格式
 * @param date 字符串/日期
 * @param fmt 返回的日期格式
 * @returns {void | string}
 */
export function dateFormat (date, fmt) {
  if (!date) {
    return ''
  }
  date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
  return fmtCallback(date, fmt)
}

/**
 * 日期/字符串转换成时间戳(毫秒)
 * @param date 字符串/日期
 * @returns {number}
 */
export function dateToTime (date) {
  if (!date) {
    return 0
  }
  date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
  return date.getTime()
}

/**
 * * 给日期增加指定时间
 * @param date 字符串/日期/时间戳
 * @param number 增加数量, 只支持正整数
 * @param addType 增加类型,可以是秒(second),分钟(minute),小时(hour),天数(day),月份(mouth),年份(year)
 * @param fmt 返回的日期格式。fmt为空,默认返回日期类型
 * @returns {string|date|number}
 */
export function dateAdd (date, number, addType, fmt) {
  if (!date || (!number && !number !== 0) || !addType) {
    return ''
  } else if (number === 0) {
    return date
  }
  number = number ? Number(number) : 0 ;
  date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
  switch (addType) {
    case 'year': {
      if (number >= 0) {
        date = date.setFullYear(date.getFullYear() + number);
      } else {
        date = date.setFullYear(date.getFullYear() - number);
      }
      break;
    }
    case 'mouth': {
      if (number >= 0) {
        date = date.setMonth(date.getMonth() + number);
      } else {
        date = date.setMonth(date.getMonth() - Math.abs(number));
      }
      break;
    }
    case 'day': {
      if (number >= 0) {
        date = date.setDate(date.getDate() + number);
      } else {
        date = date.setDate(date.getDate() - Math.abs(number));
      }
      break;
    }
    case 'hour': {
      if (number >= 0) {
        date = date.setHours(date.getHours() + number);
      } else {
        date = date.setHours(date.getHours() - Math.abs(number));
      }
      break;
    }
    case 'minute': {
      if (number >= 0) {
        date = date.setMinutes(date.getMinutes() + number);
      } else {
        date = date.setMinutes(date.getMinutes() - Math.abs(number));
      }
      break;
    }
    case 'second': {
      if (number >= 0) {
        date = date.setSeconds(date.getSeconds() + number);
      } else {
        date = date.setSeconds(date.getSeconds() - Math.abs(number));
      }
      break;
    }
    default: {
      if (number >= 0) {
        date = date.setDate(date.getDate() + number);
      } else {
        date = date.setDate(date.getDate() - Math.abs(number));
      }
      break;
    }
  }
  // fmt为空,则按传过来date参数的格式返回
  if (!fmt) {
    return date
  } else {
    return dateFormat(date, fmt)
  }
}

/**
 * 判断date1是否小于date2,如果小于,返回true, 否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
 * @param date1
 * @param date2
 * @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
 * @returns {boolean}
 */
export function isBefore (date1, date2, fmt) {
  if (!date1 || !date2) {
    return false
  }
  let dateArr = dealTowDate(date1, date2, fmt)
  return dateArr[0] < dateArr[1]
}

/**
 * 判断date1是否小于等于date2,如果小于等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
 * @param date1
 * @param date2
 * @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
 * @returns {boolean}
 */
export function isSameOrBefore (date1, date2, fmt) {
  if (!date1 || !date2) {
    return false
  }
  let dateArr = dealTowDate(date1, date2, fmt)
  return dateArr[0] <= dateArr[1]
}

/**
 * 判断date1是否大于date2,如果大于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
 * @param date1
 * @param date2
 * @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
 * @returns {boolean}
 */
export function isAfter (date1, date2, fmt) {
  if (!date1 || !date2) {
    return false
  }
  let dateArr = dealTowDate(date1, date2, fmt)
  return dateArr[0] > dateArr[1]
}

/**
 * 判断date1是否大于等于date2,如果大于等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
 * @param date1
 * @param date2
 * @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
 * @returns {boolean}
 */
export function isSameOrAfter (date1, date2, fmt) {
  if (!date1 || !date2) {
    return false
  }
  let dateArr = dealTowDate(date1, date2, fmt)
  return dateArr[0] >= dateArr[1]
}

/**
 * 判断date1是否等于date2,如果等于,返回true;否则返回false(fmt不为空,那么将传过来的日期根据fmt进行格式化,然后按指定日期格式来判断两个日期的大小。fmt为空,但要保证date1,date2的日期格式一致)
 * @param date1
 * @param date2
 * @param fmt 日期格式,可以是字符串,日期,时间戳。如fmt可以为yyyy-MM-dd等
 * @returns {boolean}
 */
export function isSame (date1, date2, fmt) {
  if (!date1 || !date2) {
    return false
  }
  let dateArr = dealTowDate(date1, date2, fmt)
  return dateArr[0] === dateArr[1]
}

/**
 * 获取当前星期几
 * @param date
 * @returns {string}
 */
export function getDayByChinese (date) {
  if (!date) {
    return ''
  }
  date = dealDateStr(date) // 对传过来的日期字符串进行处理,并将其转换成date类型
  var myddy = date.getDay() // 获取存储当前日期
  var weekday = ['周日', '周一', '周二', '周三', '周四', '周五', '周六']
  return weekday[myddy]
}

/**
 * 根据传过来的时间戳换算成几天几小时
 * @param time
 * @returns {string}
 */
export function getDaysByTime (time) {
  if (!time) {
    return ''
  }
  time = time ? Number(time) : 0
  time = (time / 3600000) // 获取小时数
  let day = time > 0 ? Math.floor(time / 24) : Math.ceil(time / 24)
  let hour = time % 24
  let str = (day ? day + '天' : '') + (hour ? hour.toFixed(0) + '小时' : '')
  return str
}

// 对传过来的日期字符串进行处理,并将其转换成date类型
function dealDateStr (date) {
  var regPos = /^[1-9]+[0-9]*]*$/; // 正整数
  var regNeg = /^-[0-9]*[1-9][0-9]*$/; // 负整数
  if (regPos.test(date) || regNeg.test(date)) { // date为时间戳,直接转成日期类型
    date = new Date(Number(date))
  } else if (typeof date === 'string') { // 如果字符串参数为日期格式,转换成日期格式
    if (date.toString().indexOf('-') > 0) {
      date = date.replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/(-)/g, '/') // 将 '-' 替换成 '/'
    } else if (date.toString().indexOf('.') > 0) {
      date = date.replace(/T/g, ' ').replace(/\.[\d]{3}Z/, '').replace(/\./g, '/') // 将 '.' 替换成 '/'
    }
    if(date.indexOf('.000+00:00') >= 0) { // 世界时间转换成北京时间,+8小时
      date = date.replace('.000+00:00', '')
      date = new Date(date)
      date = new Date(date.setHours(date.getHours() + 8))
    } else {
      date = new Date(date)
    }
  }
  return date
}

// 按fmt格式化日期
function fmtCallback (date, fmt) {
  var o = {
    'y+': date.getFullYear(), // 年份
    '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
}

// 处理两个日期格式,将其转换成时间戳再返回
function dealTowDate (date1, date2, fmt) {
  if (fmt) {
    date1 = dateToTime(dateFormat(date1, fmt))
    date2 = dateToTime(dateFormat(date2, fmt))
  } else {
    date1 = dateToTime(date1)
    date2 = dateToTime(date2)
  }
  return [date1, date2]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值