CGI-BBS > CGI > Perl > カレンダー


カレッヂ
カレッヂ


質問者 futa  投稿日 5/17(木) 03:17:19
($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
を使って、TALBEタグでカレンダーを表示させたいのですが・・・
1.月の初日(1日)の曜日を計算する方法。
(たとえば今月なら1日は火曜日なので、<td></td>という空白日を2回表示してから
  <td>1</td>を入れていきたいので)
2.月の最終日の曜日を計算したい。
どんな方法があるのでしょうか?
いろいろ考えてみたのですが、どうもうまくいかないので
どなたかアルゴリズムお教えください。
質問者 futa  [削除]  投稿日 5/17(木) 05:24:13
追加投稿します。
あれから考えたのですが、
1番は一応解決しました。

1   $blank = $wday-$mday%7;
2   if($blank<6){
3       for($b=0;$b<=$blank;$b++){print "<td>\&nbsp\;</td>\n";}
4   }

7行目の条件文は今年の4月のように1日が日曜の時で
プログラムを走らせた日が4月の土曜(7,14,21,28日)のとき
$mday%7は0の値を取り、$blankが6となり、
まるまる1週間空白(7回<td>\&nbsp\;</td>が挿入される)となってしまうので入れました。
もっときれいなプログラムがあるかもしれませんが。
しかし2番は以前として解決してません。
回答者 boy  [削除]  投稿日 5/20(日) 19:34:17
やり方は色々とあると思いますが
$blank = $wday-$mday%7; まで出来たのであれば、
後は、以外と簡単だと思います。
以下は、ご参考程度のものですが、
宜しければ、活用して見て下さい。
ちなみに良くチェックしていないので、
間違っていたらご免なさい!

#!/usr/local/bin/perl

@mday_s =(31,28,31,30,31,30,31,31,30,31,30,31);
@weeks = ('日','月','火','水','木','金','土');
@day_s = ('1'..'31'); $last_day = 0; $zero = 0;

$offset = 60*60*24*(-1); # 日付けのオフセット値

# 現在時刻を取得
($sec,$min,$hour,$mday,$mon,$year,
        $wday,$yday,$isdst) = localtime(time+($offset));
$date_now = sprintf("%04d/%02d/%02d(%s)%02d:%02d",
        $year+1900,$mon+1,$mday,$weeks[$wday],$hour,$min);

# うるう年の計算
$year_uruu = (($year) + (1900))%4;
if ($year_uruu == 0) { $mday_s[1] = 29;} else { $mday_s[1] = 28;}

# 始めの空欄数を計算
$blank = ($wday + 1) - $mday%7;
if ($blank > 6) { $blank = $blank - 7;}
if ($blank < 0) { $blank = $blank + 7;}

# 表示用配列を整形
while($#day_s >= $mday_s[$mon]) { pop(@day_s);}
while($blank > 0) { unshift(@day_s,$zero); $blank--;}

# 最終日の曜日を取得
$last_day = $#day_s;
$last_day = $last_day%7;

# カレンダ−の簡易表示
$mon_now = $mon + 1;
print "Content-type: text/html\n\n";
print "<HTML><HEAD><TITLE>Calender</TITLE>\n";
print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html\; CHARSET=x-sjis\">\n";
print "</HEAD><BODY>\n";
print "<H1>$mon_now 月</H1>\n";
print "日月火水木金土<BR>\n";

$i=0;
foreach $data (@day_s) {
        if ($data == 0) { $day = '**';} else { $day = sprintf("%02d",$data);}
        print "$day"; $i++;
        if ($i > 6 ) { print "<BR>\n"; $i = 0;}
}

# 最終日と現在時刻を表示する。
print "<HR>■今月の最終日は、$day日\($weeks[$last_day]\)です。<BR>\n";
print "■尚、現在時刻は、$date_now です。<HR>\n";
print "</BODY></HTML>\n";
exit;
質問者 futa  [削除]  投稿日 5/21(月) 01:07:37
boyさんありがとうございました。
確かに1番ができた時点でほぼできていましたね・・・情けなし
それからうるう年の計算は4で割りきれるだけではなく
4で割りきれたものの中から100で割りきれる場合はうるう年ではなく
さらにその中でも400で割りきれるものはうるう年です。

他の方が参考にするかどうかわかりませんが
一応スクリプトを載せておきます。

#! /usr/local/bin/perl5

&print_header;
&calender;
&print_footer;

sub calender{
    #時間取得
    ($sec, $min, $hour, $mday, $mon, $year, $wday) = localtime(time);
    @weeks = ('日','月','火','水','木','金','土');
    $year += 1900;
    $now_mon = $mon+1;

    #月の最終日
    @lastday = (31,28,31,30,31,30,31,31,30,31,30,31);
    if(($year % 4 == 0) && ($year % 100 != 0)){ $lastday[1] = 29;}
    if(($year % 100 == 0) && ($year % 400 == 0)){  $lastday[1] = 29;}

    #カレンダー表示
    print "<caption align=\"center\">$year.$now_mon</caption>\n";
    print "<table border=1>\n";
    print "    <tr>\n";
    for($i=0;$i<=6;$i++){
        if($i==0){  print "        <td><font color=\"red\">$weeks[$i]</font></td>\n";}
        elsif($i==6){  print "        <td><font color=\"blue\">$weeks[$i]</font></td>\n";}
        else{  print "        <td>$weeks[$i]</td>\n";}
    }
    print "    </tr>\n";

    #月の最初の空白
    $blank = $wday-$mday%7;
    $space = '&nbsp;';
    @day_s = (1..$lastday[$mon]);
    if($blank<6){
        for($i=0;$i<=$blank;$i++){  unshift(@day_s,$space);}
    }
    #月の最終日の曜日
    $last_week = $#day_s%7;
    #月の最後の空白
    for($i=$last_week;$i<6;$i++){  push(@day_s,$space);}

    for($i=0;$i<=$#day_s;$i++){
        if(($i+1)%7==1){  print "    <tr>\n";}

        if($day_s[$i]==$mday){  print "        <td bgcolor=\"yellow\">$day_s[$i]</td>\n";}
        else{  print "        <td>$day_s[$i]</td>\n";}

        if(($i+1)%7==0){  print "    </tr>\n";}
    }

    print "</table>\n";
}

#----------ヘッダー表示----------#
sub print_header{
    print "Content-type: text/html\n\n";
    print "<html>\n\n";
    print "<head><title>keiko-keijiban</title>\n\n";
    print "<body>\n\n";
    print "<h2>カレンダー</h2>\n";
}

#----------フッター表示---------#
sub print_footer{
    print "\n</body></html>\n";
}

このページは終了したので返信(回答)は書きこめません

Web裏技