我在做一个原生时间轴的需求中,遇到了接口数据的处理部分,场景为发生或结束事件的时间处理,需要依据接口时间制作时间轴刻度,其中接口数据所有时间的年月日时范围不确定,因此,就引发了一系列时间处理。并在项目组的CodeReview中,改进了处理方案。
- 时间数据本身的处理
返回接口中包含的时间格式是酱紫的:2019-06-19 10:19:10,根据项目实际情景,我需要年、月、日、时,分,秒,代码未review之前是酱紫处理的:(用例子说明吧,这样的代码太繁琐啦)
嗯~~大概就是用到了这些,多整齐呀,但……并不是最好的方式,时刻要谨记有么有更好的工具或者方法,然后,去补充了moment.js官网,各种处理时间的方法及情况,啥啥都有,貌似足够解决所有的情况了吧。let time = "2019-06-19 15:19:09"; console.log(time.toString().split('-')[0]); // 2019 console.log(time.toString().split('-')[1]); // 06 console.log(time.toString().split('-')[2].split(' ')[0]); // 19 console.log(new Date(time).toTimeString().split(' ')[0]); //15:19:09 console.log(new Date(time).toTimeString().split(' ')[0].split(':')[0]); // 15时 console.log(new Date(time).toTimeString().split(' ')[0].split(':')[1]); // 19分 console.log(new Date(time).toTimeString().split(' ')[0].split(':')[2]); // 09秒
于是,review之后,修改了代码:(例子说明~)
额~~发现一个问题,moment中的月份输出是5,明明是6月,怎么小1呢?在其他方法中也遇到了:let time = "2019-06-19 15:19:09"; console.log('年:' + this.$moment(time).year()); console.log('月:' + this.$moment(time).month()); console.log('日:' + this.$moment(time).date()); // 注意不是day! console.log('小时:' + this.$moment(time).hour()); console.log('分钟:' + this.$moment(time).minute()); console.log('秒:' + this.$moment(time).second());
上面处理后的时间中的月份也是小1,晕,后来自习阅读官方文档后,月份在有些方法中确实是小1,好吧,目前我遇到过的是month()、toArray()、toObject().console.log(this.$moment(time).toArray()); console.log(this.$moment(time).toObject());
言归正传吧,当然也可以使用toArray()转化为数组,然后按顺序取值~ - 计算两个时间戳的时间差、时间段内的最大值最小值
review之前,方法很原生,由于实际情况中需要计算最小单位为秒的时间差,所以类似这样的代码就出现了:
大概解释下,我在干啥吧,我是在计算一段总时间(秒),代码主要实现集中于其他功能,起初的时间单位未处理完成,导致出现* 60 * 60这种星星代码(捂脸),这里还有最大值和最小值的变量,代码能实现不是最终目标,精炼实现才是最终目标,因此,moment用上吧:(还是举例说明)let timeSum = (max - min) > 1 ? (max - min + 1) * 60 * 60 : 60 * 60;
实际情况中,我展示的数据需要按天或者月展示的,所以需要判断这些时间戳是否在一个时间维度中,这里diff()方法还有一个注意点,我曾这样写过:// 计算时间差 let timeStart = this.$moment('2019-06-19 10:19:10'); let timeEnd = this.$moment('2019-06-19 15:19:09'); let secondsSub = timeEnd.diff(timeStart, 'seconds'); // 秒 console.log(timeStart, timeEnd, 's ' + secondsSub, 'm ' + secondsSub / 60, 'h ' + secondsSub / 60 / 60);
嗯……原本我是想格式化一下,过滤掉日期计算时间差,然后diff()方法就报错了……大家这样用的时候注意些。最后是最值的问题(最费时的是自己写一个最值函数,里面再加一次排序?非常非常不必要,这些算法可以在面经中展示,实际代码中还是找现成的,好处你懂得),也可以利用moment实现:// 计算时间差 let timeStart = this.$moment('2019-06-19 10:19:10').format('HH:mm:ss'); let timeEnd = this.$moment('2019-06-19 15:19:09').format('HH:mm:ss'); let secondsSub = timeEnd.diff(timeStart, 'seconds'); console.log(timeStart, timeEnd, 's ' + secondsSub, 'm ' + secondsSub / 60, 'h ' + secondsSub / 60 / 60);
这里需要注意下最值函数参数的时间格式,我这里是24小时制的。let timeStart = this.$moment('2019-06-19 10:19:10'); let timeEnd = this.$moment('2019-06-19 15:19:09'); console.log(this.$moment.max(timeStart, timeEnd));
关于时间数据处理这部分暂时总结这么多吧,以后如果再遇到问题继续补充,目前看来,全部换成moment工具,代码量少很多(代码中将moment引入时设置为全局变量了),看起来精简好多,关于moment的其他用法可以参考下它的官网,很全很全。
以上内容为本次分享,欢迎大咖前来指教补充!