需求: 在线签订电子合同;

获取合同的起始时间与终止时间,以用户点击签约为起始时间,计算用户在页面中选择的合约生效时长(可选6个月、1年等等)并推算出终止时间;

实现难点: 可能存在大月小月以及平年闰年时二月的天数转换问题(例如:用户在2021年11月30号签约,选择合约生效时长为6个月,按我接到的需求这里应该设置终止时间为2022-02-28);(一、结束时间为合同到期前一天)

我用的ant-design-vue(v2版本的时间选择器)

setEndDate(time,b) {if(!this.valueTime[0]){        //valueTime是一个时间数组,valueTime[0]是开始时间   valueTime[1]是结束时间this.$message.error('请选择日期')};let a = this.SetMonth(time, b);this.valueTime[1]=a;console.log(a);},SetMonth(date, monthNum){let date1= new Date(date)var day = date1.getDate();var month = date1.getMonth()+1;var year = date1.getFullYear();var days = new Date(year, month, 0);days = days.getDate(); //获取当前日期中的月的天数var year2 = year;var month2 = parseInt(month) + parseInt(monthNum);if (month2 > 12) {year2 = parseInt(year2) + parseInt((parseInt(month2) / 12 == 0 ? 1 : parseInt(month2) / 12));month2 = parseInt(month2) % 12;if(month2 == 0) { // 正好被12整除  12月month2 = 12;year2-- ;}}var days2 = new Date(year2, month2, 0);days2 = days2.getDate();let year2IsR = (year2 % 4 == 0 && year2 % 100 != 0 || year2 % 400==0);let yearIsR = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);// debugger// 如果开始日期大月 31号 结束日期是小月if((month2 == 4 || month2 == 6 || month2 == 9 || month2 == 11) && day == 31) {day = 30;}if((day == 31 || day == 30 ) && month2 == 2) {// 判断 是否闰年if(year2IsR) {// day = 29;day = 30;} else {// day = 28;day = 29;}} else if(day == 29 && month2 == 2) {// day = 28;day = 29;}// debuggerif (month2 < 10) {month2 = '0' + month2;}if (day < 10) {day = '0' + day;}var endDate = year2 + '-' + month2 + '-' + day;return this.GetDateStr(endDate, -1);},GetDateStr(dateStr,AddDayCount) {var dd = new Date(dateStr);dd.setDate(dd.getDate()+AddDayCount);//获取AddDayCount天后的日期var y = dd.getFullYear();var m = (dd.getMonth()+1)<10?"0"+(dd.getMonth()+1):(dd.getMonth()+1);//获取当前月份的日期,不足10补0var d = dd.getDate()<10?"0"+dd.getDate():dd.getDate();//获取当前几号,不足10补0return y+"-"+m+"-"+d;},

二、还有一种需求。结束时间为合同到期当天。

    timeTransformation(time,num) {// console.log(time)let date= new Date(time)// console.log(num)console.log(date)let day = date.getDate();let month = date.getMonth();let year = date.getFullYear();// console.log(day)// console.log(month+1)// console.log(year)//如果需要精确到时分秒// dateArr = this.dateFormmat(date,'yyyy-MM-dd hh:mm:ss').split(' ');year = year + parseInt((Number(month) + Number(num)) / 12);month = (Number(month) + Number(num)) % 12;//0-11 转变为 1-12month += 1;// 大月31天,小月30天,2月份只有28天(平年)或29天(闰年)// 每年一﹑三﹑五﹑七﹑八﹑十﹑十二这七个月为大月,均三十一天switch(month){case 1 :case 3 :case 5 :case 7 :case 8 :case 10 :case 12 :day > 31 ? day = 31 : '';break;case 4 :case 6 :case 9 :case 11 :day > 30 ? day = 30 : '';break;case 2 :this.isLeapYear(year) ? (day > 29 ? day = 29 : '') : (day > 28 ? day = 28 : ''); break;default : break;  }month < 10 ? (month = '0' + month) : '';day < 10 ? (day = '0' + day) : '';// let a=year + '-' + month + '-' + day + ' ' + dateArr[1];let a=year + '-' + month + '-' + day ;console.log(a);// return year + '-' + month + '-' + day + ' ' + dateArr[1];return year + '-' + month + '-' + day;},dateFormmat(date, format){console.log(date)console.log(format)if(null==date){return ''}if(typeof(date)=='string' || typeof date === 'number'){date = (typeof date === 'number') ? new Date(date) : new Date((date || '').replace(/-/g, '/'))}var o = { "M+" : date.getMonth()+1, //month "d+" : date.getDate(), //day "h+" : date.getHours(), //hour "m+" : date.getMinutes(), //minute "s+" : date.getSeconds(), //second "q+" : Math.floor((date.getMonth()+3)/3), //quarter "S" : date.getMilliseconds() //millisecond } if(/(y+)/.test(format)) { format = format.replace(RegExp.$1, (date.getFullYear()+"").substr(4 - RegExp.$1.length)); } for(var k in o) { if(new RegExp("("+ k +")").test(format)) { format = format.replace(RegExp.$1, RegExp.$1.length==1 ? o[k] : ("00"+ o[k]).substr((""+ o[k]).length)); } } console.log(format)return format; },isLeapYear(year) {// 普通闰年:公历年份是4的倍数的,且不是100的倍数,为普通闰年。(如2004年就是闰年)// 世纪闰年:公历年份是整百数的,必须是400的倍数才是世纪闰年(如1900年不是世纪闰年,2000年是世纪闰年)return ((year % 4 == 0) && (year % 100 != 0)) ? true : ((year % 400) == 0) ? true : false;},

第二种写法,参考链接: 参考

JS 获取合同的起始时间与终止时间------日期增加自然月,年。相关推荐

  1. SpringBoot—根据起始时间和终止时间获取ES索引名称范围

    关注 wx:CodingTechWork 需求   根据ES的起始时间字段,查询索引名称范围.前提,索引名称也是按照年月来命名,如es_log_data_m202304 模板 @Slf4j publi ...

  2. JS计算请假时间(起始时间与终止时间)

    正常上班时间为周一至周五 9:00 -12:00,13:00-18:00,实现了选择了请假起始时间与终止时间后,算出请假的总小时数,此总小时数扣除了非上班时间(周末,还有一天中的非上班时间:如午休的那 ...

  3. JS计算请假时间(起始时间与终止时间可跨月)

    正常上班时间为周一至周五 8:30 -12:00,13:30-18:00,实现了选择了请假起始时间与终止时间后,算出请假的总小时数,此总小时数扣除了非上班时间(周末,还有一天中的非上班时间:如午休的那 ...

  4. 【java】【kotlin】判断当前日期是星期几、是否为月底;获取当前季度起始时间

    用kotlin写的 java代码用intellij可互转,此处不再贴出 判断当前日期是星期几 /*** 判断当前日期是星期几*/fun getWeekOfDate(dt: Date): Int {va ...

  5. 然后是几点:根据起始时间和流逝的时间计算出终止时间(起始时间和终止时间不一定在同一天内)

    今日PTA题目: 有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前 ...

  6. Java获取当日的起始时间和结束时间

    //获取0点 public static Date getStartTime() {Calendar todayStart = Calendar.getInstance();todayStart.se ...

  7. js 获取当前日期,计算往后三个月的日期

    js 获取当前日期,计算往后三个月的日期 合同管理中的试用期,即当前入职时间(年月日)与到三个月试用期的时间(年月日) //css.Partyinp{width: 40px;height: 20px; ...

  8. js 当前日期增加自然月

    js 在日期不满足的情况下就会自动加1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日.就是如果不满就会溢出到下个月,后来看了api发现了setMon ...

  9. JS获取当日起止时间时间戳

    需求 js获取当天时间的起止时间戳 new Date().setHours(hour,?min,?sec,?ms) Date对象中setHours()方法,必传参数hour,可选参数min,sec,m ...

最新文章

  1. python高级数据结构_Python高级数据结构(二)
  2. PHP中 的全局变量$_SERVER
  3. 简单灵活的 PHP页面跳转函数
  4. 高并发资金交易系统设计方案—百亿双十一、微信红包背后的技术架构
  5. 计算机网断IP修改,修改计算机名、IP
  6. 树莓派 神经网络植入_使用自动编码器和TensorFlow进行神经植入
  7. 漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!
  8. easyui datagrid 单元格内文本超出长度显示省略号
  9. 可变参数宏__VA_ARGS__和...
  10. 淘宝手淘搜索怎么做?大神导航,一个神奇的网站,从此开启大神之路!
  11. 如何在没有RTDS硬件下使用RSCAD进行仿真研究
  12. 用Python代码实现将exl表格内容,批量写到word里面
  13. 计算机二级C语言-B程序修改题
  14. 高校动态|研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格
  15. 苹果微信cookie传不到服务器,cookie解决微信不能存储localStorage的问题
  16. 如何用AI做一个好看的图案
  17. 七巧板复原算法之四——边沿贴合和空腔查找
  18. iOS 地图与指南针使用方案
  19. 微信公众号 二维码场景统计 场景二维码
  20. (七)C语言入门,代码编程,电脑关机程序【40行】【原创】

热门文章

  1. 使用UFT进行脚本录制与回放
  2. Win10隐藏桌面回收站
  3. Spring mvc框架
  4. 蓝桥杯练习系统试题集
  5. 平面设计【AI】梦幻优雅幻想花朵背景横幅矢量模板
  6. 2020年淘宝天猫双十一成交额突破新高,倍赞网祝商家继续大卖
  7. java中StringBuilder清空效率比较
  8. Scrapy 2.6 Link Extractors 链接提取器使用指南
  9. CSP-S2019颓废总结暨游记
  10. STL源码解析之内存分配器alloc