遇到的时间数据的处理方式记录

我在做一个原生时间轴的需求中,遇到了接口数据的处理部分,场景为发生或结束事件的时间处理,需要依据接口时间制作时间轴刻度,其中接口数据所有时间的年月日时范围不确定,因此,就引发了一系列时间处理。并在项目组的CodeReview中,改进了处理方案。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值