携帯iモード版のグループウェアを作ろうと考えている。グループウェアに最低限必要なものを挙げるとしたら、予定表と掲示板といったところだろうか。予定表といったら、カレンダー表示は欠かせない。そこで簡単なカレンダーを表示するPerlスクリプトを書いてみた。
カレンダー表示で必要な関数は、先ず該当年月日は、何曜日かを求める関数である。
# ——————————————————————————
# Function : get_day_of_week()
# Parameter: $year:西暦, $mon:月, $day:日
# Return : 曜日番号
# Comment : 指定日の曜日番号を取得する
# ——————————————————————————
sub getDayOfWeek {
my $year = shift; # 年
my $mon = shift; # 月
my $day = shift; # 日
if ($mon == 1 or $mon == 2) {
$year–;
$mon += 12;
}
return ($year + int($year / 4) - int($year/100) + int($year / 400)
+ int((13 * $mon + 8) / 5) + $day) % 7;
}
次に、該当年の何月は、何日あるかを求める関数である。要するに閏年を計算して月の日数を計算する関数である。
# ——————————————————————————
# Function : getMonthEndDate()
# Parameter: $year:西暦
# Return : 当該年の各月の日数テーブル
# Comment : 当該年の各月の日数テーブルを取得
# ——————————————————————————
sub getMonthEndDate {
my $year = shift; # 年
my $mon = shift; # 月
my @enddatetbl = (31,28,31,30,31,30,31,31,30,31,30,31);
if ($year =~ m/\D/) {
return ();
}
if ($year % 4 == 0) {
if ($year % 100 == 0) {
if ($year % 400 == 0) {
$enddatetbl[1] = 29;
}
else {
$enddatetbl[1] = 28;
}
}
else {
$enddatetbl[1] = 29;
}
}
else {
$enddatetbl[1] = 28;
}
return @enddatetbl[$mon - 1];
}
さらには携帯iモードでは罫線タグ(TR, TD)などは使えない。限られた狭い画面の中に1ヶ月の暦を表示するのはけっこう難しいのだが、これを何とか解決して表示させたのが下のフレーム内のカレンダーである。一応デフォルト表示は今月を、????年??月の左右の不等号をクリックすると、年月を変えることが出来る。
実は,これはまだまだ完全ではなく、祝祭日の表示はまだ棚上げの状態である。というのも、振替休日はどうするのかとか、年によって日が変わる休日をどうするかとか、けっこう難しい問題が山積しているからである。
ここまでのPerlのスクリプトが欲しい方は、下のリンクからダウンロードできる。
http://sunao-labo.hp.infoseek.co.jp/software/calender_i.lzh
