javascript - 计算谷歌应用程序脚本中日期之间的年、月、日

标签 javascript date datetime google-apps-script

我使用以下函数进行了计算,它以“X 年,Y 个月,Z 天”的格式给出了 o/p,并且对于某些日期,它给出了一些错误的 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:

预计工作时间:1 年

给定 o/p:1 年

如果我做了什么,请指正我的错误。

而且我还必须说明,我并不是在制定所有规则。一般来说,一个月是按照当月的天数来计算的。

例如,如果我们从银行获得贷款,即使那个月可能有 30 天、29 天、28 天或 31 天,我们也只会每月支付利息。

而且,如果我们以月租方式租一个房间,我们将只支付每月的租金吗?甚至可以是 3 月 20 日至 4 月 19 日。即使它包含 31 天,据说也只有一个月。请帮我总结一下。

谢谢, CL.

最佳答案

对于 JavaScript 中的复杂日期/时间操作,我发现 Moment.js图书馆真的可以提供帮助。我将其打包到一个 Apps 脚本库中,您可以使用项目 key 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(', ');
}

关于javascript - 计算谷歌应用程序脚本中日期之间的年、月、日,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16149760/

相关文章:

javascript - 激活 Controller 呈现的模板中的 Vue

javascript - Asp net mvc Form 不会像应该发布的那样在提交时发布所有字段

python - 在不进行转换的情况下按字符串日期对 Pandas 数据框进行排序

datetime - 如何在 Play! 中获取日期时间输入增删改查形式?

r - 如何展平/合并重叠的时间段

javascript - 单击按钮重新加载页面并更改按钮文本

javascript - grunt-newer 不使用 grunt-sass

java - 如何按日期字段对集合进行排序?

mysql - 在日期之间选择mysql查询?

javascript - 保存购买日期并添加 X 时间