不知何故,Apps 脚本无法获得本月的最后一天

Somehow Apps Script can't get last day of the Month

我想获取上个月到5个月前的最后一天,对应ED1到ED5。

如果我在 setOriginalDate() 中设置某个月份,我希望它自动超过该月的最后一天。 要获取该月的最后一天,您必须为下个月设置 0 天。

但有些 "ED" 无法正常工作。当我为 setOriginalDate() 设置月份“11”时,"ED2"(2 个月前)推出“10”,而不是“9”。 谁能告诉我为什么会这样?

function setOriginalDate(){
  var SD = new Date();
  SD.setFullYear(2014);
  SD.setMonth(11);
  SD.setDate(1);
  SD.setHours(0);
  SD.setMinutes(0);
  SD.setSeconds(0);
  return SD;
  }

function electiveEndDate(OriginalDate){

  var ED = setOriginalDate();
  ED.setMonth(ED.getMonth()+1);//開始日の翌月の0日目を指定(その月の最終日)
  ED.setDate(0);  
  ED.setHours(23);
  ED.setMinutes(59);
  ED.setSeconds(59);

  switch(OriginalDate){
    case 'ED':
    return Utilities.formatDate(ED, SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
    break;

    case 'ED1':
    var ED1 = ED;
    ED1.setMonth(ED.getMonth()); //1ヶ月前 現在の0日目を指定(前月の最終日)
    ED1.setDate(0);  
    return Utilities.formatDate(ED1,SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
    break;
    case 'ED2':
    var ED2 = ED;
    ED2.setMonth(ED.getMonth()-1); //2ヶ月前
    ED2.setDate(0);  
    return Utilities.formatDate(ED2,SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
    break;
    case 'ED3':
    var ED3 = ED;
    ED3.setMonth(ED.getMonth()-2); //3ヶ月前
    ED3.setDate(0);  
    return Utilities.formatDate(ED3,SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
    case 'ED4':
    var ED4 = ED;
    ED4.setMonth(ED.getMonth()-3); //4ヶ月前
    ED4.setDate(0);  
    return Utilities.formatDate(ED4,SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
    case 'ED5':
    var ED5 = ED;
    ED5.setMonth(ED.getMonth()-4); //5ヶ月前
    ED5.setDate(0);  
    return Utilities.formatDate(ED5,SpreadsheetApp.getActive().getSpreadsheetTimeZone(), 'yyyy-MM-dd');
  }

}

我不能说为什么使用 "setMonth()" 和 "setDate()" 会给你这些结果,但是你可以通过在每种情况下实例化一个新的 Date 对象并将适当的值传递给构造函数。

function electiveEndDate(OriginalDate){
  var timezone = SpreadsheetApp.getActive().getSpreadsheetTimeZone();
  var ED = setOriginalDate();
  ED.setMonth(ED.getMonth()+1);//開始日の翌月の0日目を指定(その月の最終日)
  ED.setDate(0);  
  ED.setHours(23);
  ED.setMinutes(59);
  ED.setSeconds(59);

  switch(OriginalDate){
    case 'ED':
      return Utilities.formatDate(ED, timezone, 'yyyy-MM-dd');
      break;

    case 'ED1':
      var ED1 = new Date(ED.getFullYear(),ED.getMonth(),0);
      return Utilities.formatDate(ED1,timezone, 'yyyy-MM-dd');
      break;
    case 'ED2':
      var ED2 = new Date(ED.getFullYear(),ED.getMonth()-1,0);
      return Utilities.formatDate(ED2,timezone, 'yyyy-MM-dd');
      break;
    case 'ED3':
      var ED3 = new Date(ED.getFullYear(),ED.getMonth()-2,0);
      return Utilities.formatDate(ED3,timezone, 'yyyy-MM-dd');
    case 'ED4':
      var ED4 = new Date(ED.getFullYear(),ED.getMonth()-3,0);
      return Utilities.formatDate(ED4,timezone, 'yyyy-MM-dd');
    case 'ED5':
      var ED5 = new Date(ED.getFullYear(),ED.getMonth()-4,0);
      return Utilities.formatDate(ED5,timezone, 'yyyy-MM-dd');
  }

}