前端js日期转换、比较、加减

直接上干货:

在utils目录下新建一个dateUtil.js,代码如下:(在需要用的地方引入这个js,调用相关方法传入对应参数就可以使用了)

该工具脚本,实用性很高,通用于各类前端项目,熟悉后亦可以自由扩展,使用中发现问题还请道友留言提示下,本人会同步更新:

// 日期转时间戳
const getUnixTime = (dateStr) => {
  let newstr = dateStr.replace(/-/g, '/')
  let date = new Date(newstr)
  let time_str = date.getTime().toString()
  return time_str.substring(0, 10)
}

// 时间戳转日期,falg:true表示只要年月日,part: year month date
const toDate = (number, flag, part) => {
  let n = number
  let date = new Date(parseInt(n) * 1000)
  let y = date.getFullYear()
  let m = date.getMonth() + 1
  m = m < 10 ? ('0' + m) : m
  let d = date.getDate()
  d = d < 10 ? ('0' + d) : d
  let h = date.getHours()
  h = h < 10 ? ('0' + h) : h
  let minute = date.getMinutes()
  let second = date.getSeconds()
  minute = minute < 10 ? ('0' + minute) : minute
  second = second < 10 ? ('0' + second) : second
  if (flag) {
    if (part == 'year') {
      return y
    } else if (part == 'month') {
      return m
    } else if (part == 'date') {
      return n
    }
    return y + '-' + m + '-' + d
  }
  return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second
}


// 判断两个日期时间戳相差多少天,参数为时间戳
const dateCompare = (dateTimeStamp1, dateTimeStamp2) => {
  let dayNum = 0
  if (dateTimeStamp1 > dateTimeStamp2) {
    dayNum = Math.floor((dateTimeStamp1 - dateTimeStamp2) / 86400)
  } else {
    dayNum = Math.floor((dateTimeStamp2 - dateTimeStamp1) / 86400)
  }
  return dayNum
}


// 判断过去某个时间点到当前时间是否达到多少天,可以用来定期清理缓存
const datePassDays = (dateTimeStamp, days) => {
  let now = getUnixTime(formatDateThis(new Date()))
  let diffValue = now - dateTimeStamp
  let limitTime = days * 86400
  if (diffValue >= limitTime) {
    return true
  }
  return false
}


// 当前日期加减天数,falg:true表示只要年月日
const mathChangeDate = (date, method, days, flag) => {
  // method:'+' || '-'
  // ios不解析带'-'的日期格式,要转成'/',不然Nan,切记
  let dateVal = date.replace(/-/g, '/')
  let timestamp = Date.parse(dateVal)
  if (method == '+') {
    timestamp = timestamp / 1000 + 24 * 60 * 60 * days
  } else if (method == '-') {
    timestamp = timestamp / 1000 - 24 * 60 * 60 * days
  }
  return toDate(timestamp, flag)
}


// 时间戳转换具体时间描述(传入数值型时间戳)
const getDateDiff = (dateTimeStamp) => {
  let result = ''
  let minute = 1 * 60
  let hour = minute * 60
  let day = hour * 24
  let halfamonth = day * 15
  let month = day * 30
  let now = getUnixTime(formatDateThis(new Date())) // 有些特殊 不能使用 new Date()
  let diffValue = now - dateTimeStamp
  if (diffValue < 0) {
    return
  }
  let monthC = diffValue / month
  let weekC = diffValue / (7 * day)
  let dayC = diffValue / day
  let hourC = diffValue / hour
  let minC = diffValue / minute


  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
}


// 获取当前年份,月份, 例: getCurrentTime("year")
const getCurrentTime = (method, date = new Date()) => {
  if (method == 'year') {
    return date.getFullYear()
  } else if (method == 'month') {
    return date.getMonth() + 1
  }
  return date
}


// 获取当前服务器时间,参数直接用 new Date() 就可以了
const formatDateThis = (date, lab = '-') => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  const hour = date.getHours()
  const minute = date.getMinutes()
  const second = date.getSeconds()
  return [year, month, day].map(formatNumber).join(lab) + ' ' + [hour, minute, second].map(formatNumber).join(':')
}


// 当前年月日
const formatTime = (date, lab = '-') => {
  const year = date.getFullYear()
  const month = date.getMonth() + 1
  const day = date.getDate()
  return [year, month, day].map(formatNumber).join(lab)
}
// 当前时分秒
const formatTimes = time => {
  const hour = time.getHours()
  const minute = time.getMinutes()
  const second = time.getSeconds()
  return [hour, minute, second].map(formatNumber).join(':')
}
// 补0
const formatNumber = n => {
  n = n.toString()
  return n[1] ? n : '0' + n
}


// 比较两个时间大小(格式参考yyyy-mm-dd hh:mm:ss)
const compareTime = (startTime, endTime) => {
  // 结束时间大于开始时间就是true  , 反之则为 false
  let sn = getUnixTime(startTime) * 1
  let en = getUnixTime(endTime) * 1
  if (en > sn) {
    return true
  }
  return false
}


export {
  dateCompare,
  getCurrentTime,
  getUnixTime,
  formatDateThis,
  formatTime,
  formatTimes,
  toDate,
  getDateDiff,
  mathChangeDate,
  compareTime,
  datePassDays
}
posted @ 2019-07-02 18:55  南之骄阳  阅读(14378)  评论(0编辑  收藏  举报