我一直在使用这个函数的计算,它给人的O / P在“X年,Y个月,Z DAYS”的格式和一些日期的给一些错误的O / P。 我觉得我做了一些计算公式中失踪。
该功能,
/**
* @param {Date} startdate
* @param {Date} enddate
* @return {String}
*/
function leasePeriodCalc(startDate,endDate)
{
var sdate=startDate;
var edate=endDate;
edate.setDate( edate.getDate()+1);
edate=new Date(edate);
if(sdate.valueOf()>edate.valueOf()){
return('0');
}
else{
var years=((((edate.getDate()-sdate.getDate())<0 ? -1:0)+((edate.getMonth()+1)-(sdate.getMonth()+1)))< 0 ? -1 : 0)+(edate.getFullYear()-sdate.getFullYear());
var months=((((edate.getDate()-sdate.getDate())<0 ? -1:0)+((edate.getMonth()+1)-(sdate.getMonth()+1)))< 0 ?12:0)+((edate.getDate()-sdate.getDate())<0 ? -1:0)+((edate.getMonth()+1)-(sdate.getMonth()+1));
if((edate.getMonth()-1)!=1.0)
{
var days=((edate.getDate()-sdate.getDate())< 0 ?new Date(edate.getFullYear(), edate.getMonth(),0).getDate():0)+(edate.getDate()-sdate.getDate());
}
else
{
var days=((edate.getDate()-sdate.getDate())< 0 ?new Date(edate.getFullYear(), edate.getMonth()+1,0).getDate():0)+(edate.getDate()-sdate.getDate());
}
var day;
var month;
var year;
if(years>1)year= years+ 'Years';
else year=years+'Year';
if(months>1) month= months+ 'Months';
else month=months+'Month';
if(days>1) day= days+ 'Days';
else day=days+'Day';
if(years==0&&months!=0&&days!=0) return(month+', '+day);
else if(years!=0&&months==0&&days!=0) return(year+', '+day);
else if(years!=0&&months!=0&&days==0) return(year+', '+month);
else if(years==0&&months==0&&days!=0) return(day);
else if(years==0&&months!=0&&days==0) return(month);
else if(years!=0&&months==0&&days==0) return(year);
else if(years==0&&months==0&&days==0) return(day);
else if(years!=0&&months!=0&&days!=0) return(year+', '+month+', '+day);
}
}
如果你给人的I / P如下它返回假O / P:
2013年2月28日 - 2014年2月28日
预期O / P:1年,1天
鉴于O / P:1年,4天
但是,如果我选择2013年2月28日 - 2014年2月27日的手段,这给了正确的O / P:
预期O / P:1 YEAR
鉴于O / P:1 YEAR
请指点纠正我的错,如果我做了什么。
同时,我必须告诉大家,我不是制定规则n的所有。 一般而言,一个月计算按天躺在一个月。
例如,如果我们从银行获得贷款,我们会支付仅占甚至是一个月一个月的利息可以有30天或29天或28天或31天。
而且,如果我们采取月租手段的房间,我们会每月支付的租金只仪式? 甚至也可以是从3月20日至19日四月 即使它包含31天它被说成是只用了一个月。 请帮我总结这一点。
TNX,CL。
Answer 1:
对于复杂的日期/时间操作在JavaScript中我发现Moment.js库可以真正的帮助。 我把它包成Google Apps脚本库,它可以包括使用项目的关键MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48 。 我用它来采取裂缝这个问题,虽然我可能已经错过了一些边缘情况。
// Load the library (key: MHMchiX6c1bwSqGM1PZiW_PxhMjh3Sh48).
var moment = Moment.load();
function getDuration(startDate, endDate) {
var start = moment(startDate);
var end = moment(endDate);
var units = ['years', 'months', 'days'];
var parts = [];
units.forEach(function(unit, i) {
var diff = Math.floor(end.diff(start, unit, true));
if (diff > 0 || i == units.length - 1) {
end.subtract(unit, diff);
parts.push(diff + ' ' + unit);
}
})
return parts.join(', ');
}
Answer 2:
您可以包括moment.js
作为外部扶养和使用谷歌应用程序脚本项目中。 指的https://stackoverflow.com/a/45231921/5429123文章,你可以做这样的事情。
eval(UrlFetchApp.fetch('https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js').getContentText());
var date = moment().format("MMM Do YY");
Logger.log(date)
这将让你moment.js的最后一个版本(2.22.2为2018年10月25日的),相比老2.4.0可作为气体库(如接受的答案建议)。
PS - 这工作!
Answer 3:
第二次尝试:
function periodCalc(startDate, endDate) {
var output = '';
var sYear = startDate.getFullYear();
var sMonth = startDate.getMonth();
var sDay = startDate.getDate() - 1;
var eYear = endDate.getFullYear();
var eMonth = endDate.getMonth();
var eDay = endDate.getDate();
var tMonths = eYear * 12 + eMonth - sYear * 12 - sMonth;
var days = eDay - sDay;
if (days < 0) {
tMonths--;
var sDate = new Date(sYear, sMonth + tMonths, sDay);
var eDate = new Date(eYear, eMonth, eDay);
days = (eDate.getTime() - sDate.getTime()) / 86400000;
}
if (tMonths < 0) return '0';
var months = tMonths % 12;
var years = (tMonths - months) / 12;
output += (years == 0 ? '' : (', ' + years + ' Year' + (years == 1 ? '' : 's')));
output += (months == 0 ? '' : (', ' + months + ' Month' + (months == 1 ? '' : 's')));
output += (days == 0 ? '' : (', ' + days + ' Day' + (days == 1 ? '' : 's')));
return output.substr(2);
}
然而,当开始日期为每月的第一天,而结束日期是本月的最后一天,一个问题仍然存在。 因此,例如,2013年1月1日,以年3月31将返回2个月,31天。 这是理想的结果?
编辑:第一次尝试(这是有缺陷的,首先看到的评论):
我必须承认,我的大脑伤害有点看代码,我敢肯定,只在逻辑一个小错误的地方。 我认为这将是更快,如果我试图从头重写,但我认为这将需要一些进一步的测试(它与我有限的测试工作至今):
function periodCalc(startDate, endDate) {
var output = '';
endDate.setFullYear(endDate.getFullYear(), endDate.getMonth(), endDate.getDate() + 1);
var sYear = startDate.getFullYear();
var sMonth = startDate.getMonth();
var sDay = startDate.getDate();
var eDay = endDate.getDate();
var days = eDay - sDay;
if (days < 0) {
var eopm = new Date(endDate);
eopm.setDate(0);
days = eDay + eopm.getDate() - sDay;
endDate.setDate(eDay - days);
}
var eMonth = endDate.getMonth();
var months = eMonth - sMonth;
if (months < 0) {
months = eMonth + 12 - sMonth;
endDate.setMonth(eMonth - months);
}
var eYear = endDate.getFullYear();
var years = eYear - sYear;
if (years < 0) return '0';
output += (years == 0 ? '' : (', ' + years + ' Year' + (years == 1 ? '' : 's')));
output += (months == 0 ? '' : (', ' + months + ' Month' + (months == 1 ? '' : 's')));
output += (days == 0 ? '' : (', ' + days + ' Day' + (days == 1 ? '' : 's')));
return output.substr(2);
}
Answer 4:
下面是我写的前一阵子,它不完全测试,但认为它应该做它应该做的
[更新]:固定的错误,但还是演技有趣,当低的日期是02月29日和DIFF是一年以上
function dateDiff(a,b){
var low = (a>b)?b:a,
heigh = (a>b)?a:b,
diff = {
years:0,
months:0,
days:0
},
tmpDate,
tmpMonth;
//if you'd like the diff to be including the the last day
// of the end date you can do: lob.setDate(low.getDate()+1);
if(low==heigh){return diff;}//a===b no difference
diff.years=heigh.getFullYear()-low.getFullYear();
tmpDate=new Date(low.getTime());
tmpDate.setFullYear(low.getFullYear()+diff.years);
if(tmpDate>heigh){
diff.years--;
}
low.setFullYear(low.getFullYear()+diff.years);
tmpMonth=heigh.getMonth()-low.getMonth();
diff.months=(tmpMonth<0)?tmpMonth+12:tmpMonth;
tmpDate=new Date(low.getTime());
tmpDate.setMonth(low.getMonth()+diff.months);
if(tmpDate>heigh){
diff.months--;
}
low.setMonth(low.getMonth()+diff.months);
while(low<heigh){
low.setDate(low.getDate()+1);
diff.days++;
if(low>heigh){
low.setDate(low.getDate()-1);
diff.days--;
break;
}
}
return diff;
}
var a = new Date(2013,9,30);
var b = new Date(2014,1,26);
console.log(dateDiff(a,b));
//next one is a bit buggy, one might say it's
// 1 year and 1 day if considoring end of feb 2000
// to 1st of mar 2001
var a = new Date(2000,1,29);
var b = new Date(2001,2,1);
console.log(dateDiff(a,b));
Answer 5:
以下为我工作的代码执行前确保ü副moment.js脚本
var moment = Moment.load()
var StartDate= new Date(StartDate1);
var DD1 = StartDate.getDate();
var MM1 = StartDate.getMonth();
var MM1=MM1+1 //As Month Start with Zero
var YYYY1 = StartDate.getYear();
var EndDate= new Date(EndDate1);
var DD = EndDate.getDate();
var MM = EndDate.getMonth();
var MM=MM+1 //As Month Start with Zero
var YYYY = EndDate.getYear();
var a = moment([YYYY, MM, DD]);
var b = moment([YYYY1, MM1, DD1]);
return a.diff(b, 'days')
Logger.log(a.diff(b, 'days') )
Answer 6:
Date.Diff的其他替代方案。 xDate结束日期Javascript对象的包装:
//-----------------------------------------------------------------------------
// Date Wrapper
//-----------------------------------------------------------------------------
var kDate = function () {
"use strict";
var dat = NaN, that = this;
switch (arguments.length) {
case 0: dat = new Date(); break;
case 1: dat = new Date(arguments[0]); break;
default:
dat = new Date( arguments[0] || null, arguments[1] || null, arguments[2] || null, arguments[3] || null,
arguments[4] || null, arguments[5] || null, arguments[6] || null);
}
Object.getOwnPropertyNames(Date.prototype).forEach(function(prop) {
that[prop] = function () {
return dat[prop].apply(dat, arguments);
};
});
return this;
};
Object.getOwnPropertyNames(Date).forEach(function(prop) {
if (["length", "name", "arguments", "caller", "prototype"].indexOf(prop) < 0) {
kDate[prop] = Date[prop];
}
});
kDate.MAXDATE = 8640000000000000;
kDate.MINDATE = -8640000000000000;
kDate.YEARZERO = -62167132800000;
kDate.YEAR = 31536000000;
kDate.MONTH = 2592000000;
kDate.DAY = 86400000;
kDate.HOUR = 3600000;
kDate.MINUTE = 60000;
kDate.SECOND = 1000;
//-----------------------------------------------------------------------------
// kDate.diff()
//-----------------------------------------------------------------------------
kDate.diff = function(date1, date2) {
var d1, d2;
d1 = kDate.MAXDATE + (typeof date1 === 'number' ? date1 : date1.getTime());
d2 = kDate.MAXDATE + (typeof date2 === 'number' ? date2 : date2.getTime());
diff = new kDate(NaN);
diff.diffDate1 = new kDate(typeof date1 === 'number' ? date1 : date1.getTime());
diff.diffDate2 = new kDate(typeof date2 === 'number' ? date2 : date2.getTime());
diff.diffTotalMilliseconds = d2 < d1 ? d1 - d2 : d2 - d1;
diff.setTime(kDate.YEARZERO + diff.diffTotalMilliseconds);
diff.diffTotalSeconds = diff.diffTotalMilliseconds / kDate.SECOND;
diff.diffTotalMinutes = diff.diffTotalMilliseconds / kDate.MINUTE;
diff.diffTotalHours = diff.diffTotalMilliseconds / kDate.HOUR;
diff.diffTotalDates = diff.diffTotalMilliseconds / kDate.DAY;
diff.diffYears = diff.diffDate1.getUTCFullYear() - diff.diffDate2.getUTCFullYear();
diff.diffMonth = diff.diffDate1.getUTCMonth() - diff.diffDate2.getUTCMonth();
diff.diffDate = diff.diffDate1.getUTCDate() - diff.diffDate2.getUTCDate();
diff.diffHours = diff.diffDate1.getUTCHours() - diff.diffDate2.getUTCHours();
diff.diffMinutes = diff.diffDate1.getUTCMinutes() - diff.diffDate2.getUTCMinutes();
diff.diffSeconds = diff.diffDate1.getUTCSeconds() - diff.diffDate2.getUTCSeconds();
diff.diffMilliseconds = diff.diffDate1.getUTCMilliseconds() - diff.diffDate2.getUTCMilliseconds();
return diff;
};
kDate.prototype.diff = function (date) {
return kDate.diff(this, date);
};
Answer 7:
看看这里的例子: http://ditio.net/2010/05/02/javascript-date-difference-calculation/
更清洁的代码,更易于阅读。 (和它的作品!);-)
文章来源: Calculating year, month, days between dates in google apps script