zhangzheng-zz / blog

1 stars 0 forks source link

Js学习 #4

Open zhangzheng-zz opened 4 years ago

zhangzheng-zz commented 4 years ago

日期相关

今天、明天、XX天后 判断

 /*
 * 比较dstTimeStamp与srcTimeStamp
 * dstTimeStamp是否为srcTimeStamp同一天或者明日
 */
/**
 * @param {any} srcTimeStamp: 
 * @param {number} dstTimeStamp: 
 */
  getDateOffset (srcTimeStamp: any, dstTimeStamp: number) {
    if (!dstTimeStamp) return ''
    let srcDate = new Date(srcTimeStamp)
    if (srcTimeStamp == null) {
      srcDate = new Date(new Date().setHours(0, 0, 0, 0))
    }
    let dstDate = new Date(new Date(dstTimeStamp).setHours(0, 0, 0, 0))
    let diffInMs = dstDate.getTime() - srcDate.getTime()
    const dayInMs = 24 * 60 * 60 * 1000
    const dayDiff = Math.floor(diffInMs / dayInMs)
    if (dayDiff === 0) return '今日'
    if (dayDiff === 1) return '明日'
    else return dayDiff + '天后'
  }

判断对当前时间/传入时间是否在一天的某个时间段 传入的开始与结束时间段只有这种格式 : 08:00:00

// 判断时间是否在一天内的某个时间段
/**
 * @param {string} beginTime: 开始时间段 05:00:00
 * @param {string} endTime: 结束时间段 08:00:00
 * @param {number} timeStamp: 时间戳
 */
 function checkAuditTime (beginTime:string, endTime: string, timeStamp?: number) {
  // 当前时间
  let nowDate:any
  if (timeStamp) {
    nowDate = new Date(timeStamp)
  }
  nowDate = new Date()

  // 开始 结束 时间
  let beginDate = new Date(nowDate)
  let endDate = new Date(nowDate)

  let beginTimer = beginTime.split(':')
  let endTimer = endTime.split(':')

  // 开始 时 分 秒
  let beginHour = Number(beginTimer[0])
  let beginMinue = Number(beginTimer[1])
  let beginSecond = Number(beginTimer[2])
  beginDate.setHours(beginHour, beginMinue, beginSecond, 0)

  // 结束 时 分 秒
  let endHour = Number(endTimer[0])
  let endMinue = Number(endTimer[1])
  let endSecond = Number(endTimer[2])
  endDate.setHours(endHour, endMinue, endSecond, 0)

  if (nowDate.getTime() - beginDate.getTime() >= 0 && nowDate.getTime() <= endDate.getTime()) {
    return true
  } else {
    return false
  }
}

dayjs

// 判断时间是否在一天内的某个时间段
import dayjs from 'dayjs'
const customParseFormat = require('dayjs/plugin/customParseFormat')
dayjs.extend(customParseFormat)
/**
 * @param {string} beginTime: 开始时间段 05:00:00
 * @param {string} endTime: 结束时间段 08:00:00
 * @param {number} timeStamp: 时间戳
 */
export function checkAuditTime (start:string, end:string, timeStamp?: number): boolean {
  const startTime = dayjs(start, 'hh-ss-mm')
  const endTime = dayjs(end, 'hh-ss-mm')
  const cur = timeStamp ? dayjs(timeStamp) : dayjs()
  if (cur >= startTime && cur <= endTime) {
    return true
  } else {
    return false
  }
}
zhangzheng-zz commented 3 years ago

数字字符串相关

0-9 a-z随机数

// 36进制使用了 0-9 a-z 字母来表示
function genRandomKey () {
  return Math.random().toString(36)
    .slice(2)
}

toFixed的坑

js中toFixed是四舍六入,五考虑,五之后大于零才进一,否则舍弃


(10.466).toFixed(2)
// "10.47"

(10.464).toFixed(2)
// "10.46"

(10.465).toFixed(2)
// "10.46"

(10.4651).toFixed(2)
// "10.47"

toFixed(n) n超过本身数字时候补0

(1.9).toFixed(3)
// "1.900"

以上两个问题解决方案:

// 目标:(1.945).toFixed(2)   ->  1.95      四舍五入
//          (1.945).toFixed(4)   ->  1.945    多余位数不补零
Number.prototype.toFixed = function(length) {
  // 进位
  let carry = 0
  let num, multiple
  // 转字符串
  let str = this + ''
  // 去小数点位置
  let dot = str.indexOf('.')
  // 判断保留的后一位是否大于等于 5 大于等于 5 有进位 否则没有
  if (str.substr(dot + length + 1, 1) >= 5) carry = 1
  // 十的几次倍数
  multiple = Math.pow(10,length)
  // 乘以倍数向下取整再加上 进位 5入操作
  num = Math.floor(this * multiple) + carry
  // 再除以倍数 去零操作
  let res = num / multiple + ''
  return res
}
zhangzheng-zz commented 2 years ago

遍历对象: // 包含不可继承 for in Object.keys() Object.entries() // 包含不可枚举 Object.getOwnPropertyNames() // 以上遍历不到 symbol ownKeys 可以 Reflect.ownKeys()

// 单独遍历 symbol Object.getOwnPropertySymbols()