不想动脑系列之-指定时间段随机生成一个合法时间

2,040 阅读2分钟
让你明明白白学知识,有代码,有讲解,抄的走,学的会!

需求

我们可能经常要批量生成指定时间区间时间,但是, mockjs 生成的时间是随机,但是没有区间限定

下面自己写了一个工具函数

utils.js

function generateTime (start, end) {
  // 开始时间
  let s = new Date(start)
  let e = new Date(end)

  if (Number.isNaN(s.getTime())) {
    throw new Error('传入的开始时间格式不对,请参照 2020-12-20, 或者 2020-12-20 10:22:01')
  }

  if (Number.isNaN(s.getTime())) {
    throw new Error('传入的结束时间格式不对,请参照 2020-12-20, 或者 2020-12-20 10:22:01')
  }

  // 中间的间隔
  let distance = e.getTime() - s.getTime()

  if (distance < 0) {
    throw new Error('开始时间小于结束时间')
  }

  let t = new Date(s.getTime() + parseInt(Math.random() * distance))
  // 年-月-日 (月, 日是补齐0的)
  let t1 = t.toJSON().substring(0, 10)

  t = t.toLocaleString().replace(/\//g, '-').split(' ')

  let t2 = t[1].substr(2)

  // 时分秒 可能缺少0
  t2 = t2.split(':').map(p => {
    if (p.length !== 2) {
      p = '0' + p
    }
    return p
  }).join(':')

  return t1 + ' ' + t2
}

module.exports = {
  generateTime
}

test.js

let { generateTime } = require('../utils/time')

// 正确的
console.log(generateTime('2020-10-10', '2020-12-02 22:12:10'))

// 故意传错时间格式
console.log(generateTime('a', '2020-12-02 22:12:10'))

// 开始时间大于结束时间
console.log(generateTime('2020-12-22', '2020-12-02 22:12:10'))

运行

node test.js

注意事项

  • 你以为的 new Date('a') 会报一个 异常,其实不会, 返回的类型仍旧是 Date类型, 那就需要判断传入的字符串日期是不是合法的
new Date('s')  // Invalid Date

// 没有报错,竟然返回的还是一个对象!!!
typeof new Date('s')  // "object"

// what ,没想到还是一个日期类型
Object.prototype.toString.call(new Date('s')) // "[object Date]"

// 虽然不报错,那我直接调用方法去取值,没毛病吧!
typeof new Date('s').getTime() // "number"

// 我去判断是不是NaN 就知道了
new Date('s').getTime() // NaN

// new Date('2020-12-11').getTime() 返回是一个数字,不是NaN
Number.isNaN(new Date('2020-12-11').getTime()) // false

所以,结合上面的几个示例

function isValidDate(str) {
	return !Number.isNaN(new Date(str).getTime()
}
  • 日期操作,你最烦的就是 月 + 1, 还有月,日, 时,分,秒 前面补齐0, 对吧,上面都给你做好了
  • 一开始也是想lodash 有没有自动判断一个字符串是不是时间类型的_.isDate(),发现那个方法没卵用,不信你自己写个demo跑跑🤔🤔 🤔

每天学习一个偷懒小技巧 😏😏 😏