我是javascript新手。
我有特定的月份专栏(9/30/2022,10/31/2022,11/30/2022)。我有一份有开始日期和结束日期(跨越多个月)的合同。
我需要确定合同在特定月份列中有效的天数。
示例:
联系人开始日期:09/15/2022
合同结束日期:10/24/2022该合同在2022年9月的有效天数为16天。
我发现下面的代码给出了每个月的合同期限(即)**9 - 17;10 - 23;* *
事先感谢您的帮助。
我找到了这个代码
function getDays() { var dropdt = new Date(document.getElementById("arr").value); var pickdt = new Date(document.getElementById("dep").value); var result = ""; for (var year = dropdt.getFullYear(); year <= pickdt.getFullYear(); year++) { var firstMonth = (year == dropdt.getFullYear()) ? dropdt.getMonth() : 0; var lastMonth = (year == pickdt.getFullYear()) ? pickdt.getMonth() : 11; for (var month = firstMonth; month <= lastMonth; month++) { var firstDay = (year === dropdt.getFullYear() && month === firstMonth) ? dropdt.getDate() : 1; var lastDay = (year === pickdt.getFullYear() && month === lastMonth) ? pickdt.getDate() : 0; var lastDateMonth = (lastDay === 0) ? (month + 1) : month var firstDate = new Date(year, month, firstDay); var lastDate = new Date(year, lastDateMonth, lastDay); result += (month + 1) + " - " + parseInt((lastDate - firstDate) / (24 * 3600 * 1000) + 1) + "; "; } } return result; } function cal() { if (document.getElementById("dep")) { document.getElementById("number-of-dates").value = getDays(); }
计算'
下面的代码片段将生成一个对象res
,其中键为从零开始的月份索引("8";是九月,&;9&;值是这些月份中每个月的天数:
const start=new Date("2022-09-15");
const end=new Date("2022-11-24");
let nextFirst=new Date(start.getTime()), month, days={};
do {
month=nextFirst.getMonth();
nextFirst.setMonth(month+1);nextFirst.setDate(1);
days[month]=Math.round(((nextFirst<end?nextFirst:end)-start)/86400000);
start.setTime(nextFirst.getTime());
} while(nextFirst<end)
console.log(days);
这可以扩展成一个更可靠的函数,返回年-月组合:
function daysPerMonth(start,end){
let nextFirst=new Date(start.getTime()), year, month, days={};
do {
year=nextFirst.getFullYear();
month=nextFirst.getMonth();
nextFirst.setMonth(month+1);nextFirst.setDate(1);
days[`${year}-${String(1+month).padStart(2,"0")}`]=Math.round(((nextFirst<end?nextFirst:end)-start)/86400000);
start.setTime(nextFirst.getTime());
} while(nextFirst<end)
return days;
}
[["2022-09-15","2022-11-24"],["2022-11-29","2023-02-04"]].forEach(([a,b])=>
console.log(daysPerMonth(new Date(a),new Date(b))));
管理和计算日期、时间和日期时间在javascript和跨浏览器中是出了名的挑剔。与其尝试自己定义逻辑,不如使用著名的moments .js库。
特别是要计算两个日期之间的长度,您可以使用两个时刻之间的diff函数
var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 25]);
var diff = a.diff(b, 'days') // 1
console.log(diff);
<script src="https://momentjs.com/downloads/moment.js"></script>
支持的测量方法有年、月、周、日、时、分、秒。