让你明明白白学知识,有代码,有讲解,抄的走,学的会!
需求
我们可能经常要批量生成指定时间区间时间,但是, 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跑跑🤔🤔 🤔
每天学习一个偷懒小技巧 😏😏 😏