在我们的范围内的ServiceNow应用程序中,我们有一个要求来计算两个日期之间的年,月和天的数量。以下我们的业务规则运作良好,但并非100%完美:
(function executeRule(current, previous /*null when async*/) {
var t = new GlideDateTime(current.from.getDisplayValue());
var f = new GlideDateTime(current.to.getDisplayValue());
var duration = GlideDateTime.subtract(t, f).getDayPart();
var durationYears = Math.floor(duration/365);
var durationMonths = Math.floor((duration % 365)/30);
var durationDays = Math.floor((duration % 365)%30);
current.setValue('year', durationYears);
current.setValue('month', durationMonths);
current.setValue('day', durationDays);
})(current, previous);
如果假设每个月有30天,则此方法很好。但是,月份长度显然可以在29-31天之间(包括leap年)。在不使用诸如moment.js之类的库的情况下,关于以上代码的任何建议都可以更加准确?
谢谢!
答案 0 :(得分:0)
使用this answer作为参考。
基本上,它计算每个日期的年份值之前的of年数,然后从较晚的日期中减去较早日期的结果。
有了该数字后,您就可以在工作日计数中添加那么多天了。
// ... the rest of your code
var durationDays = Math.floor((duration % 365)%30) + LeapYearsBetween(fromYearValue, toYearValue);
function LeapYearsBetween(start, end)
{
return LeapYearsBefore(end) - LeapYearsBefore(start + 1);
}
function LeapYearsBefore(year)
{
year -= 1;
return (year / 4) - (year / 100) + (year / 400);
}
希望这会为您指明正确的方向。
答案 1 :(得分:0)
月份和年份只需使用gdt.getMonth()和gdt.getYear()计算,如果相隔数年,则相加12个月。
年:gdt1.getYear() - gdt2.getYear()
几个月gdt1.getMonth() - gdt2.getMonth() + yearDifference*12
据我所知,日子应该是正确的。您也可以Difference in Months between two dates in JavaScript
检查该线程