VBAのFormat関数の日時部分をJavaScriptで再現

VBAにはFormat関数があり日時や数値を整形します。
これをJavaScriptで再現してみました。なお全部ではなく日時部分だけです。
「date_format(日付オブジェクト,フォーマット)」のようにして使います。
例えばフォーマットを「yyyymmdd」とすると「20160118」に変換します。

function date_format(date_obj, format) {
  //VBAのFormat関数の日時部分を再現。
  //yyyy:年4桁,yy:年下2桁
  //mmmm:月英語(January),mmm:月英語(Jan)
  //mm:月2桁,m:月
  //oooo:月(1月)
  //dddd:曜日(Saturday),ddd:曜日(Sat)
  //aaaa:曜日(土曜日),aaa:曜日(土)
  //dd:日2桁,d:日
  //hh:時2桁,h:時
  //nn:分2桁,n:分
  //ss:秒2桁,s:秒
  //ggg:元号(平成),gg:元号(平),g:元号(H)
  //ee:和暦年2桁,e:和暦年
  //ww:第○週
  //q:第○四半期
  //y:第○日
  var nen, tsuki, hi, yobi, ji, fun, byo, gengo, gengoa, wareki_nen, ganjitsu, days, weeks, temp;
  nen = date_obj.getFullYear();
  tsuki = date_obj.getMonth() + 1;
  hi = date_obj.getDate();
  yobi = date_obj.getDay();
  ji = date_obj.getHours();
  fun = date_obj.getMinutes();
  byo = date_obj.getSeconds();
  //時
  format = format.replace(/hh/g, ("0" + ji).slice(-2));
  format = format.replace(/h/g, ji);
  //分
  format = format.replace(/nn/g, ("0" + fun).slice(-2));
  format = format.replace(/n/g, fun);
  //秒
  format = format.replace(/ss/g, ("0" + byo).slice(-2));
  format = format.replace(/s/g, byo);
  //年
  format = format.replace(/yyyy/g, nen);
  format = format.replace(/yy/g, ("0" + (nen % 100)).slice(-2));
  //和暦年
  if(date_obj < (new Date(1912, 7 - 1, 31))) {
    gengo = "明治";
    gengoa = "M";
    wareki_nen = nen - 1867;
  } else if(date_obj < (new Date(1926, 12 - 1, 26))) {
    gengo = "大正";
    gengoa = "T";
    wareki_nen = nen - 1911;
  } else if(date_obj < (new Date(1989, 1 - 1, 8))) {
    gengo = "昭和";
    gengoa = "S";
    wareki_nen = nen - 1925;
  } else {
    gengo = "平成";
    gengoa = "H";
    wareki_nen = nen - 1988;
  }
  format = format.replace(/ggg/g, gengo);
  format = format.replace(/gg/g, gengo.substr(0, 1));
  format = format.replace(/g/g, gengoa);
  format = format.replace(/ee/g, ("0" + wareki_nen).slice(-2));
  format = format.replace(/e/g, wareki_nen);
  //月の部分
  format = format.replace(/mmmm/g, "月全部"); //January
  format = format.replace(/mmm/g, "月部分"); //Jan
  format = format.replace(/mm/g, ("0" + tsuki).slice(-2));
  format = format.replace(/m/g, tsuki);
  format = format.replace(/oooo/g, tsuki + "月"); //1月
  //週
  ganjitsu = new Date(nen, 0, 1);
  days = Math.floor((date_obj - ganjitsu) / 24 / 60 / 60 / 1000);
  weeks = Math.floor((days + ganjitsu.getDay() - yobi) / 7) + 1;
  format = format.replace(/ww/g, weeks);
  format = format.replace(/q/g, Math.ceil(tsuki / 3));
  format = format.replace(/y/g, days + 1);
  //曜日
  format = format.replace(/dddd/g, "曜日全部"); //Sunday
  format = format.replace(/ddd/g, "曜日部分"); //Sun
  temp = ["日", "月", "火", "水", "木", "金", "土"][yobi];
  format = format.replace(/aaaa/g, temp + "曜日");
  format = format.replace(/aaa/g, temp);
  format = format.replace(/w/g, yobi + 1);
  //日
  format = format.replace(/dd/g, ("0" + hi).slice(-2));
  format = format.replace(/d/g, hi);
  //月
  temp = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"][tsuki - 1];
  format = format.replace(/月全部/g, temp);
  format = format.replace(/月部分/g, temp.substr(0, 3));
  //曜日
  temp = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"][yobi];
  format = format.replace(/曜日全部/g, temp);
  format = format.replace(/曜日部分/g, temp.substr(0, 3));
  return format;
}

コメント

タイトルとURLをコピーしました