封装Date库

66 阅读2分钟

封装一个日期库,实现增删改查

JS自带库

const now = new Date() //获取本地当前时间
const d1 = new Date(2001,1,3,14,15,16,999) //20012const d2 = new Date(1600_000_000) //时间戳可以为负数吗
const d3 = new Date('2001-02-03T14:15:16') //获取本地当前时间
now = Date.now()  //获取本地当前时间

查部分
const year = d.getFullYear()
const month = d.getMonth() + 1  //montn 0 表示 1const day = d.getDate()
const weekday = d.getDay()

const hours = d.getHours()
const minutes = d.getMinutes()
const seconds = d.getSeconds()
const ms = d.getMilliseconds()

查整体
let iso8601格式的字符串 = d.toISOString()
let 时间戳 = d.valueOf()
let 时间戳 = d - 0
let 时间戳 = +d

改部分
d.setFullYear(n)
d.setMonth(n-1)
d.setDate(n)
//d.setDay(n) 没有这个方法,改第几天是上面那个方法

d.setHours(n)
d.setMinutes(n)
d.setSeconds(n)
d.setMilliseconds(n)

自己封装的time库

function time(...params) {
  if (!(this instanceof time)) {
    return new time(...params)
  }
  if (arguments.length > 1) {
    params[1] -= 1
  }
  this.date = new Date(...params)
}
time.prototype = {
  constructor: time,
  parts(attrs) {
    if (attrs === undefined) {
      return {
        year: this.date.getFullYear(),
        month: this.date.getMonth() + 1,
        day: this.date.getDate(),
        weekday: this.date.getDay(),
        hour: this.date.getHours(),
        minute: this.date.getMinutes(),
        second: this.date.getSeconds(),
        ms: this.date.getMilliseconds()
      }
    } else {
      const { year, month, day, hour, minute, second, ms } = attrs
      year !== undefined && this.date.setFullYear(year)
      month !== undefined && this.date.setMonth(month - 1)
      day !== undefined && this.date.setDate(day)
      hour !== undefined && this.date.setHours(hour)
      minute !== undefined && this.date.setMinutes(minute)
      second !== undefined && this.date.setSeconds(second)
      ms !== undefined && this.date.setMilliseconds(ms)
    }
  },
  //将日期设置为几天后
  add(n, unit) {
    const valid = 'year month day hour minute second ms'.split(' ').includes(unit)
    if (!valid) { // 防御性编程
      throw new Error('你传了一个什么单位,我不认识: ' + unit)
    }
    const table = {
      ms: 1,
      second: 1000,
      minute: 1000 * 60,
      hour: 1000 * 60 * 60,
      day: 1000 * 60 * 60 * 24,
    }
    if (unit === 'year') {
      this.date.setFullYear(this.date.getFullYear() + n)
    } else if (unit === 'month') {
      this.date.setMonth(this.date.getMonth() + n)
    } else { // 加上对应的毫秒数
      this.date = new Date(this.date - 0 + table[unit] * n)
    }
  },
  //判断闰年
  isLeapYear() {
    const year = this.date.getFullYear()
    if (year % 4 === 0) {
      if (year % 100 === 0) {
        if (year % 400 === 0) {
          return true
        } else {
          return false
        }
      } else {
        return true
      }
    } else {
      return false
    }
  },
  //获取这个月的最后一天
  lastDayOfMonth() {
    const { year, month, hour, minute, second, ms } = this.parts()
    return new time(year, month + 1, 0, hour, minute, second, ms)
  },
  //输出2000年01月02日 00:00
  format(pattern) {
    // 支持的占位符有 yyyy MM dd HH mm ss
    const { year, month, day, hour, minute, second } = this.parts()
    return pattern.replace(/yyyy/g, year)
      .replace(/MM/g, padLeftZero(month))
      .replace(/dd/g, padLeftZero(day))
      .replace(/HH/g, padLeftZero(hour))
      .replace(/mm/g, padLeftZero(minute))
      .replace(/ss/g, padLeftZero(second))
  }
}

//如果n<0 前面拼接一个0
function padLeftZero(n) {
  return n > 10 ? '' + n : '0' + n
}