カレッヂ |
質問者 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>\ \;</td>\n";} 4 } 7行目の条件文は今年の4月のように1日が日曜の時で プログラムを走らせた日が4月の土曜(7,14,21,28日)のとき $mday%7は0の値を取り、$blankが6となり、 まるまる1週間空白(7回<td>\ \;</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 = ' '; @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裏技 |