doilux’s tech blog

ITに関する備忘録。 DDP : http://doiluxng.hatenablog.com/entry/2018/01/01/195409

GASで現在時刻から現在のスプリントを取得する

スプリントが金曜~翌木曜で、現在時刻から今のスプリントを取得する。 例えば、今日が2018.09.17なら、2018.09.14-20という文字列を取得する。

とりあえず、今週金曜日を取得するコードはこちら

  var this_day = new Date()
  var this_friday = new Date(this_day)
  this_friday.setDate(this_day.getDate() - (this_day.getDay() - 5));

なんかすごく冗長なので、Momentjsとやらを使ってみる。

tonari-it.com

こうなった。

  var this_day = Moment.moment()
  var this_friday = Moment.moment(this_day).isoWeekday(5);

で、スプリントの期間を取得するのはこうなる

/**
 * 引数に指定した日付からスプリントの文字列を取得する
 * Momentjsに依存
 * https://tonari-it.com/gas-moment-js-moment/
 */
function getActiveSprint(){
  // this_day = 2018.09.17 -> 2018.09.14-20
  var this_day = Moment.moment().startOf('day')  
  var td = this_day.format('YYYY-MM-DD HH:mm:SS')
  
  var this_friday = Moment.moment(this_day).isoWeekday(5); 
  var previous_friday = (this_day < this_friday) ?
      Moment.moment(this_friday).subtract(7, 'days') :
      Moment.moment(this_friday)
      
                  
  var this_thursday = Moment.moment(this_day).isoWeekday(4);
  var next_thursday = (this_thursday < this_day) ?
                  Moment.moment(this_thursday).add(7, 'days') :
                  Moment.moment(this_thursday)
  
  return previous_friday.format('YYYY.MM.DD') + '-' + next_thursday.format('DD')
}

さらに共通化してこうなった

/**
 * 引数に指定した日付からスプリントの文字列を取得する
 * Momentjsに依存
 * https://tonari-it.com/gas-moment-js-moment/
 */
function getActiveSprint(dt){
   var this_day = Moment.moment(dt).startOf('day')  
  var previous_friday = getNextOrPreNDay(this_day, 'PREVIOUS', 'FRI')
  var next_thursday = getNextOrPreNDay(this_day, 'NEXT', 'THU')
  return previous_friday.format('YYYY.MM.DD') + '-' + next_thursday.format('DD')
}


/**
 * dtから次または前のN曜日の日付を返す
 */
function getNextOrPreNDay(dt, nxPre, day) {  
  var dayStrs = ['SUN', 'MON', 'THE', 'WED', 'THU', 'FRI', 'SAT'];
  var dayNum = dayStrs.indexOf(day)
  
  var this_day = Moment.moment(dt).startOf('day')
  var this_n_day = Moment.moment(this_day).isoWeekday(dayNum); 
  var previous_n_day = (this_day < this_n_day) ?
      Moment.moment(this_n_day).subtract(7, 'days') :
      Moment.moment(this_n_day)
  var next_n_day = (this_n_day < this_day) ?
                  Moment.moment(this_n_day).add(7, 'days') :
                  Moment.moment(this_n_day)
  
  if ( nxPre == 'NEXT' ) {
    return next_n_day;
  } else if(nxPre == 'PREVIOUS') {
    return previous_n_day
  }
}

テスト

QUnit.helpers( this );
 
function doGet( e ) {
  QUnit.urlParams( e.parameter );
  QUnit.config({
    title: "GAS のユニットテスト"
  });
  QUnit.load( myTests );
  return QUnit.getHtml();
};


function myTests() {
  module('getActiveSprint 関数テスト');
 
  test('正常系', function () {
    strictEqual(getActiveSprint(new Date('2018-09-14')),
                '2018.09.14-20',
                '2018-09-14は金曜日なので、14-20');
    
    strictEqual(getActiveSprint(new Date('2018-09-13')),
                '2018.09.07-13',
                '2018-09-13は木曜日なので、7-13');
   });

}