time.js

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)
  },
  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))
  }
}

function padLeftZero(n) {
  return n > 10 ? '' + n : '0' + n
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值