JS 获取合同的起始时间与终止时间------日期增加自然月,年。
需求: 在线签订电子合同;
获取合同的起始时间与终止时间,以用户点击签约为起始时间,计算用户在页面中选择的合约生效时长(可选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 获取合同的起始时间与终止时间------日期增加自然月,年。相关推荐
- SpringBoot—根据起始时间和终止时间获取ES索引名称范围
关注 wx:CodingTechWork 需求 根据ES的起始时间字段,查询索引名称范围.前提,索引名称也是按照年月来命名,如es_log_data_m202304 模板 @Slf4j publi ...
- JS计算请假时间(起始时间与终止时间)
正常上班时间为周一至周五 9:00 -12:00,13:00-18:00,实现了选择了请假起始时间与终止时间后,算出请假的总小时数,此总小时数扣除了非上班时间(周末,还有一天中的非上班时间:如午休的那 ...
- JS计算请假时间(起始时间与终止时间可跨月)
正常上班时间为周一至周五 8:30 -12:00,13:30-18:00,实现了选择了请假起始时间与终止时间后,算出请假的总小时数,此总小时数扣除了非上班时间(周末,还有一天中的非上班时间:如午休的那 ...
- 【java】【kotlin】判断当前日期是星期几、是否为月底;获取当前季度起始时间
用kotlin写的 java代码用intellij可互转,此处不再贴出 判断当前日期是星期几 /*** 判断当前日期是星期几*/fun getWeekOfDate(dt: Date): Int {va ...
- 然后是几点:根据起始时间和流逝的时间计算出终止时间(起始时间和终止时间不一定在同一天内)
今日PTA题目: 有时候人们用四位数字表示一个时间,比如 1106 表示 11 点零 6 分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前 ...
- Java获取当日的起始时间和结束时间
//获取0点 public static Date getStartTime() {Calendar todayStart = Calendar.getInstance();todayStart.se ...
- js 获取当前日期,计算往后三个月的日期
js 获取当前日期,计算往后三个月的日期 合同管理中的试用期,即当前入职时间(年月日)与到三个月试用期的时间(年月日) //css.Partyinp{width: 40px;height: 20px; ...
- js 当前日期增加自然月
js 在日期不满足的情况下就会自动加1个月,比如在当前时间为3月31号,传入1,1两个参数,预期结果为2月29日,但是结果输出了3月2日.就是如果不满就会溢出到下个月,后来看了api发现了setMon ...
- JS获取当日起止时间时间戳
需求 js获取当天时间的起止时间戳 new Date().setHours(hour,?min,?sec,?ms) Date对象中setHours()方法,必传参数hour,可选参数min,sec,m ...
最新文章
- python高级数据结构_Python高级数据结构(二)
- PHP中 的全局变量$_SERVER
- 简单灵活的 PHP页面跳转函数
- 高并发资金交易系统设计方案—百亿双十一、微信红包背后的技术架构
- 计算机网断IP修改,修改计算机名、IP
- 树莓派 神经网络植入_使用自动编码器和TensorFlow进行神经植入
- 漫话:应用程序被拖慢?罪魁祸首竟然是Log4j!
- easyui datagrid 单元格内文本超出长度显示省略号
- 可变参数宏__VA_ARGS__和...
- 淘宝手淘搜索怎么做?大神导航,一个神奇的网站,从此开启大神之路!
- 如何在没有RTDS硬件下使用RSCAD进行仿真研究
- 用Python代码实现将exl表格内容,批量写到word里面
- 计算机二级C语言-B程序修改题
- 高校动态|研究生被录取后放导师鸽子,学校要上报教育部失信名单取消其推免资格
- 苹果微信cookie传不到服务器,cookie解决微信不能存储localStorage的问题
- 如何用AI做一个好看的图案
- 七巧板复原算法之四——边沿贴合和空腔查找
- iOS 地图与指南针使用方案
- 微信公众号 二维码场景统计 场景二维码
- (七)C语言入门,代码编程,电脑关机程序【40行】【原创】