2008年01月02日 02:15 [Edit]

javascript - カレンダーを作る

JavaScriptの書き初めにおあつらえ向きの問題。

年間カレンダー どう書く?org
nを入力としてn年の年間カレンダーを返すプログラムを作ってください 少なくとも日曜日と土曜日が判別出来るようにしてください

コピペして再利用しやすいよう、なるべく素直に書いてみました。カレンダーをDOMで作るという作業は結構あると思います。良問ですね。ご自由にお使いください。

CSS

.mcal { border: inset 1px; float:left; font-size:smaller }
.mcal td,th { width: 2em; text-align:right }
.ycal  { border: dotted 1px; font-size:smaller }
.ycal td,th { width: 2em; text-align:right }
.sun { background-color:#ffcccc }
.sat { background-color:#ccccff }

JS

function leap(year){
  return year % 4 ? 0 : year % 100 ? 1 : year % 400 ? 0 : 1;
}

function make_cal_array(year){
  var months = [31, 28 + leap(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
  var result = [];
  for (var m = 0; m < 12; m++){
    result[m] = [];
    var dofw1 = (new Date(year, m, 1, 0, 0, 0)).getDay();
    for (var d = 1; d <= months[m]; d++){
      result[m][d + dofw1 - 1] = d;
    }
  }
  return result;
}

var daynames = ['sun','mon','tue','wed','thu','fri','sat'];

function make_cal_yearly(year){
  var cal = make_cal_array(year);
  var tbody = document.createElement('tbody');
  for (var m = 0; m < 12; m++){
    var tr = document.createElement('tr');
    var th = document.createElement('th');
    th.innerHTML = m + 1;
    tr.appendChild(th);
    for (var d = 0, l = cal[m].length; d < l; d++){
      var td = document.createElement('td');
      if (cal[m][d]){
        td.innerHTML = cal[m][d];
        td.className = daynames[d % 7];
      }
      tr.appendChild(td);
    }
    tbody.appendChild(tr);
  }
  var table = document.createElement('table');
  table.className = 'ycal';
  var caption = document.createElement('caption');
  caption.innerHTML = year;
  table.appendChild(caption);
  table.appendChild(tbody);
  return table;
}

function make_cal_monthly(year, m){
  var cal = make_cal_array(year);
  var table = document.createElement('table');
  // header
  var tr = document.createElement('tr');
  for (var d = 0; d < 7; d++){
    var th = document.createElement('th');
    th.innerHTML = th.className = daynames[d];
    tr.appendChild(th);
  }
  var thead = document.createElement('thead');
  thead.appendChild(tr);
  table.appendChild(thead);
  // body;
  var tbody = document.createElement('tbody');
  for (var d = 0, l = cal[m].length; d < l; d++){
    if (d % 7 == 0) tr = document.createElement('tr');
    var td = document.createElement('td');
    if (cal[m][d]){
      td.innerHTML = cal[m][d];
      td.className = daynames[d % 7];
    }
    tr.appendChild(td);
    if (d % 7 == 6) tbody.appendChild(tr);
  }
  tbody.appendChild(tr);
  table.className = 'mcal';
  var caption = document.createElement('caption');
  caption.innerHTML = year + '.' + (m+1);
  table.appendChild(caption);
  table.appendChild(tbody);
  return table;
}

function make_calendars(year, p){
  p.innerHTML = '';
  p.appendChild(make_cal_yearly(year));
  for (var m = 0; m < 12; m++){
   var mcal = make_cal_monthly(year, m);
   p.appendChild(mcal);
   if (m % 3 == 2){
     var br = document.createElement('br');
     br.clear = 'all';
     p.appendChild(br);
   }
  };
}

Enjoy!

Dan the JavaScripter


この記事へのトラックバックURL

この記事へのトラックバック
出荷日カレンダーをご確認ください【出荷日カレンダーをご確認ください】★送料無料★サンベネデットスパークリングミネラルウォーター 1.5L 【12本(6本パック×2)】商品価格:2,300円レビュー平均:4.84キャンパストートバッグ+特製卓上カレンダープレゼント!【正規品】...
カレンダー【goo検索最新トレンド】at 2008年01月09日 05:32
高級風化天珠 亀甲高級風化天珠 亀甲テュッシュカバー・ピンクチュール天然石の詰め合わせ ピンク2008年年間カレンダー日本語版ジルコニア用留具 RO30 ロジウムシルバー(4個)フォーマルハンガーピン...
カレンダー【未羽のNEWS日記】at 2008年01月09日 10:19
404 Blog Not Found:javascript - カレンダーを作る
404 Blog Not Found:javascript - カレンダーを作る【】at 2012年01月22日 16:43
この記事へのコメント
 よろしければ作るのにかかった時間を教えていただけないでしょうか?
Posted by kuma_hati at 2008年01月02日 09:01
あけましておめでとうございます。昨年もたいへん楽しませていただきました。
今年もよろしくお願いいたします。
せっかくのjavascriptの書初めですから、執筆途中のアマグラマー本に取り込めないでしょうか?
Posted by 九龍 at 2008年01月02日 12:04
ピペして再利用しやすいよう、なるべく素直に書いてみました。カレンダーをDOMで作るという作業は結構あると思います。良問ですね。ご自由にお使いください
Posted by abc at 2008年01月03日 04:31
はじめまして。携帯から「ポケットはてな」を見て、ここに至りました。

就職してよりこの方、自分がどの程度に達したかを確かめたくて、いくつかの
言語で「年間カレンダー」を投稿してみました。おかげさまで、この数日間は
楽しみました。書き初めの意味でも有意義だったと感じています。

今日西尾泰和さんという方のブログを目にする機会があり、そこで「どう書く
?org」が作られるに至った経緯を知りました。正直、自分が考えていたよりも
もう一段深い意図があったことに気付き、無神経に書き散らしてしまった自分
を恥ずかしく思いました。

これからはもう少しコードの再利用性という点にも配慮して、楽しんでいこう
と思います。

# とはいえ、どマイナーな言語で書いたものが思いの外受けが良かったりして、
# 少々戸惑いましたが...
Posted by silverwire at 2008年01月06日 22:47