JS计算两个时间间隔
栏目: JavaScript · 发布时间: 5年前
内容简介:JavaScript计算两个时间相隔了 多少年多少月多少日。时分秒这里不作考虑。若需要和当前时间比较,这里提供当前时间的获取格式化方法。我这里是根据传入类型输出日期或者日期+时间,可以明显看出传入两个参数,格式如:2008-08-08
1 前言
1.1 业务场景
JavaScript计算两个时间相隔了 多少年多少月多少日。时分秒这里不作考虑。
2 实现原理
2.1 获取当前时间
若需要和当前时间比较,这里提供当前时间的获取格式化方法。我这里是根据传入类型输出日期或者日期+时间,可以明显看出 type
为 day
时,输出日期。
getNowDate(type){ let now = new Date() let year = now.getFullYear() let month = now.getMonth() + 1 let day = now.getDate() let hh = now.getHours() let mm = now.getMinutes() let ss = now.getSeconds() month = month < 10 ? '0'+ month : month day = day < 10 ? '0'+ day : day if(type == 'day'){ return year +'-'+ month +'-'+ day } else { return year +'-'+ month +'-'+ day + ' '+ hh + ':' + mm + ':' + ss } },
2.2比较时间
传入两个参数,格式如:2008-08-08
getDiffYmdBetweenDate(sDate1,sDate2){ var fixDate = function(sDate){ var aD = sDate.split('-'); for(var i = 0; i < aD.length; i++){ aD[i] = fixZero(parseInt(aD[i])); } return aD.join('-'); }; var fixZero = function(n){ return n < 10 ? '0'+n : n; }; var fixInt = function(a){ for(var i = 0; i < a.length; i++){ a[i] = parseInt(a[i]); } return a; }; var getMonthDays = function(y,m){ var aMonthDays = [0,31,28,31,30,31,30,31,31,30,31,30,31]; if((y%400 == 0) || (y%4==0 && y%100!=0)){ aMonthDays[2] = 29; } return aMonthDays[m]; }; var checkDate = function(sDate){ }; var y = 0; var m = 0; var d = 0; var sTmp; var aTmp; sDate1 = fixDate(sDate1); sDate2 = fixDate(sDate2); if(sDate1 > sDate2){ return 'past' } var aDate1 = sDate1.split('-'); aDate1 = fixInt(aDate1); var aDate2 = sDate2.split('-'); aDate2 = fixInt(aDate2); //计算相差的年份 /*aTmp = [aDate1[0]+1,fixZero(aDate1[1]),fixZero(aDate1[2])]; while(aTmp.join('-') <= sDate2){ y++; aTmp[0]++; }*/ y = aDate2[0] - aDate1[0]; if( sDate2.replace(aDate2[0],'') < sDate1.replace(aDate1[0],'')){ y = y - 1; } //计算月份 aTmp = [aDate1[0]+y,aDate1[1],fixZero(aDate1[2])]; while(true){ if(aTmp[1] == 12){ aTmp[0]++; aTmp[1] = 1; }else{ aTmp[1]++; } if(([aTmp[0],fixZero(aTmp[1]),aTmp[2]]).join('-') <= sDate2){ m++; } else { break; } } //计算天数 aTmp = [aDate1[0]+y,aDate1[1]+m,aDate1[2]]; if(aTmp[1] > 12){ aTmp[0]++; aTmp[1] -= 12; } while(true){ if(aTmp[2] == getMonthDays(aTmp[0],aTmp[1])){ aTmp[1]++; aTmp[2] = 1; } else { aTmp[2]++; } sTmp = ([aTmp[0],fixZero(aTmp[1]),fixZero(aTmp[2])]).join('-'); if(sTmp <= sDate2){ d++; } else { break; } } return {y:y,m:m,d:d} },
返回的结果是一个对象,包含了 y m d
三个属性,可根据业务进行取用展示。
比较时间的时候,若 sDate1
为小的时间,这里直接返回 past
。
2.3 页面展示
这里根据业务不同可以作不同的展示。这里列出自己的Vue展示处理展示。
其中 this.dataForm.hasdata
为页面的v-model。这样的处理的效果是观看直观。
let now = this.getNowDate('day') let diffDate = this.getDiffYmdBetweenDate(now,this.data) let hasdata = '' if(diffDate == 'past'){ this.dataForm.hasdata = '已过期' } else { if(diffDate.y > 0){ hasdata += diffDate.y + '年' + diffDate.m + '月' } else if (diffDate.y == 0) { if(diffDate.m > 0){ hasdata += diffDate.m + '月' } } this.dataForm.hasdata = hasdata + diffDate.d + '日' }
2.4 页面效果
3 后记
感谢支持。若不足之处,欢迎大家指出,共勉。
如果觉得不错,记得点赞 ,谢谢大家:joy:
3.1 参考资料
3.2 时间处理js库
这里列举几个js库备查找使用,排序无意义。
- moment
- day
- date-fns
- miment
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 我用了两个月的时间才理解 let
- 如何在Hibernate/JPA中配置具有两个连接池的两个数据源
- 如何合并两个 TensorFlow 模型
- 关于sqlmap的两个小坑
- 昨天 GitHub 挂了两个小时
- Openstack两个容易混淆的概念
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Security Testing Cookbook
Paco Hope、Ben Walther / O'Reilly Media / 2008-10-24 / USD 39.99
Among the tests you perform on web applications, security testing is perhaps the most important, yet it's often the most neglected. The recipes in the Web Security Testing Cookbook demonstrate how dev......一起来看看 《Web Security Testing Cookbook》 这本书的介绍吧!