JavaScript で日付の計算などなど

Google Spreadsheet で作業セル(一時的に値を入れておくセル)を使ってごちゃごちゃと処理していた部分を GAS で js で自分で関数を作って整理した。時間かかったけれどすっきりしたぜ。
今朝インストールした SpiderMonkey の対話環境もちょっとしたことを確認するのに役に立った。

function getMonthLastDay(year, month) {
  // 月末の日付を求める
  // month: 1 月は 0 から始まり 11 は 12 月
  // Date: 日付を 0 にすると前月の最終日を返す 
  var day = new Date(year, month, 0);
  var endDate = day.getDate();
  return endDate;
}


function getQuarter(year, first) {
  // 四半期の総日数を求める
  var LastDay_first = getMonthLastDay(year, first);
  var LastDay_second = getMonthLastDay(year, first+1);
  var LastDay_third = getMonthLastDay(year, first+2);
  var TotalDays = LastDay_first + LastDay_second + LastDay_third;
  return TotalDays;
}


function pastDays(year, first) {
  // 四半期の経過日数を求める
  var LastDay_first = getMonthLastDay(year, first);
  var LastDay_second = getMonthLastDay(year, first+1);
  var LastDay_third = getMonthLastDay(year, first+2);
  var Today = new Date();
  var TodayDate = Today.getDate();
  var trueMonth = Today.getMonth() + 1;
  // return month;

  switch (trueMonth) {
    case first:
      return TodayDate;
      break;
    case first+1:
      return LastDay_first + TodayDate;
      break;
    case first+2:
      return LastDay_first + LastDay_second + TodayDate;
      break;
  }
}


function restDays(year, first) {
  // 四半期の残り日数を求める
  var LastDay_first = getMonthLastDay(year, first);
  var LastDay_second = getMonthLastDay(year, first+1);
  var LastDay_third = getMonthLastDay(year, first+2);
  var Today = new Date();
  var Month = Today.getMonth();
  // Month - 1 が実際の月を表す
  var MonthTotal = getMonthLastDay(year, Month+1);
  var MonthRest = MonthTotal - Today.getDate();
  // 月間の残り日数
  // return nMonthRest;
  
  var TrueMonth = Month + 1;
  // return month;

  switch (TrueMonth) {
    case first:
      return LastDay_second + LastDay_third + MonthRest;
      break;
    case first+1:
      return LastDay_third + MonthRest;
      break;
    case first+2:
      return MonthRest;
      break;
  }
}


function centile(num, denom, decim) {
  // パーセンテージを取得する
  // decim はデフォルト 0, 最大 16 桁
  decim = Math.min(16, decim || 0);
  var percentile = Math.floor((num / denom) * Math.pow(10, 2 + decim)) / Math.pow(10, decim);
  return percentile;
}


function achieveRate(score, goal) {
  // 達成率を求める
  var Rate = centile(score, goal, 2);
  return Rate + "%";
}


function pastDaysRateQuarter(year, first) {
  // 四半期の経過日数の割合を求める
  var PastDays = pastDays(year, first);
  var TotalDays = getQuarter(year, first);
  var Rate = centile(PastDays, TotalDays, 1);
  return Rate + "%";
}


function restDaysQuarter(year, first){
  // 四半期の残り日数を求める
  var RestDays = restDays(year, first);
  var TotalDays = getQuarter(year, first);
  return RestDays + "/" + TotalDays + "日";
}

Closure Compiler でコンパイルするとこうなる

改行やインデントは見やすいように手直しした。

function getMonthLastDay(b,a){
    return(new Date(b,a,0)).getDate()
}

function getQuarter(b,a){
    var c=getMonthLastDay(b,a),e=getMonthLastDay(b,a+1),d=getMonthLastDay(b,a+2);
    return c+e+d
}

function pastDays(b,a){
    var c=getMonthLastDay(b,a),e=getMonthLastDay(b,a+1);
    getMonthLastDay(b,a+2);
    var d=new Date,f=d.getDate();
    switch(d.getMonth()+1){
    case a:return f;
    case a+1:return c+f;
    case a+2:return c+e+f
    }
}

function restDays(b,a){
    getMonthLastDay(b,a);
    var c=getMonthLastDay(b,a+1),e=getMonthLastDay(b,a+2),d=new Date,f=d.getMonth(),d=getMonthLastDay(b,f+1)-d.getDate();
    switch(f+1){
    case a:return c+e+d;
    case a+1:return e+d;
    case a+2:return d
    }
}

function centile(b,a,c){
    c=Math.min(16,c||0);
    return Math.floor(b/a*Math.pow(10,2+c))/Math.pow(10,c)
}

function achieveRate(b,a){
    return centile(b,a,2)+"%"
}

function pastDaysRateQuarter(b,a){
    var c=pastDays(b,a),e=getQuarter(b,a);
    return centile(c,e,1)+"%"
}

function restDaysQuarter(b,a){
    var c=restDays(b,a),e=getQuarter(b,a);
    return c+"/"+e+"\u65e5"
};