ここは、CGIの改造(中級編2)についてお話いたします。
当然、HTMLの知識は必須です。
教材は私が練習で作った
掲示板です。
為にならないかもしれませんが、作ってみました。
今回は時間の表示形式を変えてみましょう。
このサンプルの時間表示は、
「2001年6月5日 15時07分」となっています。
これを、「01'06/05 (The) 15:07"15」としてみましょう。
見るところは、書き込み処理のところの200行目あたり。
($sec,$min,$hour,$mday,$mon,$year) = localtime(time); $year = $year+1900; $mon = $mon+1; if ($min < 10) {$min="0$min";} $data = "$year年$mon月$mday日 $hour時$min分"; |
というところです。 これを解説しますと、時間を表示するだけなら、
$time = localtime(time); |
と、するだけでもできますが、これだと「$time」が「Tue Jun 5 15:07:15 2001」
と、置き換えられます。これだと見にくいので、表示形式を変えてやります。
変えてやるには、まず一つ一つを分けてあげます。
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); |
こうすると、「$sec」には秒数が、「$min」には分が、「$hour」には時間が、
「$mday」には日にちが、「$mon」には月が、「$year」には年が、「$wday」には曜日がそれぞれ入ります。
しかし、ここで不都合がでてきます。
まず、月ですが、0〜11の数字を取ります。
つまり、取った数字に1を足してやらないと正しい月が出てきませんので、
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $mon = $mon+1; |
としてやります。
ちなみに、ここをシングルクォーテーションやダブルクウォーテーションでこう囲うと
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $mon = '$mon+1'; $mon2 = "$mon+1"; |
正しく計算されません。
シングルクウォーテーションは文字列をそのまま表示されるのに使用されるので、
変数も代入されずそのまま表示されてしまいます。
ダブルクウォーテーションは、変数は置換されますが、その外は文字列として扱われるので、
計算式を入れても文字として扱われ、計算しません。
$mon → $mon+1 $mon2 → 6+1 |
あと、年ですが、なぜか1900年からの年数を取ってくれます。
(2001年だと、101を取ります)
ので、4桁にしたい場合は1900を足してやり、2桁にしたい場合は100を引いてやります。
ここでは2桁にしたいので、100を引きますが、単純に
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $year = $year-100; |
とやると、「$yaer」は「1」とされ、10以下は一桁となってしまうので、
10以下は「0」を付け足してやるという条件を指定しないと見にくくなります。
条件は、「if」を使います。もし○○が○○だったらこうする、というような形です。
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $year = $year-100; if ($year < 10){$year = "0$year" ;} |
これは、もし、「$year」より「10」の方が大きかったら、{} の中の文
(「$year」の左に「0」を付け足す)を実行するという意味です。
if文はこの先も使うので頭に入れておきましょう。
ちなみに、これは計算式でも何でもないので、
ダブルクウォーテーションで括らないとエラーが出ます。
あと、「$wday」ですが、これは0〜6という数字を取りますので、 これを曜日に置換します。(0が日曜です)
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); if ($wday == 0){$wday = '日曜' ;} elsif ($wday == 1){$wday = '月曜' ;} elsif ($wday == 2){$wday = '火曜' ;} elsif ($wday == 3){$wday = '水曜' ;} elsif ($wday == 4){$wday = '木曜' ;} elsif ($wday == 5){$wday = '金曜' ;} else {$wday = '土曜' ;} |
さっきのif文とはちょっと違いますね。「if」の下に「elsif」があり、最後に「else」で指定しています。
これは、「if」で条件が合わなかったときに、下の「elsif」を探して、
それでも合わないときにまた下の条件を探します。
「elsif」でも合わなかったとき、「else」として、残ったものはここを実行するという意味です。
最後の「else」の時、()で条件をつけてしまうとエラーになります。
(ちなみに、「<」や「==」は、数字の条件式です。文字列でこれを使うとエラーになります。
数式の条件式は
if ($aa == $bb) → $aaと$bbが等しいとき if ($aa != $bb) → $aaと$bbが等しくないとき if ($aa < $bb) → $aaが$bbより小さいとき if ($aa > $bb) → $aaが$bbより大きいとき if ($aa <= $bb) → $aaが$bbより等しいか小さいとき if ($aa >= $bb) → $aaが$bbより等しいか大きいとき if (($aa==2) && ($bb==3)) → $aaが2で、$bbが3のとき if (($aa==2) || ($bb==3)) → $aaが2、または、$bbが3のとき |
というような式になります。
文字列を使う場合はそのうち後で書き足します。)
上で指定したように、「if」だけでも指定できます。その場合は、
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); if ($wday == 0){$wday = '日曜' ;} if ($wday == 1){$wday = '月曜' ;} if ($wday == 2){$wday = '火曜' ;} if ($wday == 3){$wday = '水曜' ;} if ($wday == 4){$wday = '木曜' ;} if ($wday == 5){$wday = '金曜' ;} if ($wday == 6){$wday = '土曜' ;} |
となります。
単純なものならこれでもよいのですが、○○だったらこうで、それ以外だったらこう、
というような使い方だったら「elsif」などを使った方がいいでしょう。
また、本当はもっと手っ取り早い書き方もありますが、また別の話なので、ここでは説明しません。
上記のことを踏まえて、「01'06/05 (The) 15:07"15」という風にしようとすると、
($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time); $year = $year-100; $mon = $mon+1; if ($sec < 10) {$sec="0$sec";} if ($min < 10) {$min="0$min";} if ($hour < 10) {$hour="0$hour";} if ($mday < 10) {$mday="0$mday";} if ($mon < 10) {$mon="0$mon";} if ($year < 10){$year = "0$year" ;} if ($wday == 0){$wday = 'Sun' ;} elsif ($wday == 1){$wday = 'Man' ;} elsif ($wday == 2){$wday = 'Tue' ;} elsif ($wday == 3){$wday = 'Wed' ;} elsif ($wday == 4){$wday = 'Thu' ;} elsif ($wday == 5){$wday = 'Fry' ;} else {$wday = 'Sat' ;} $data = "$year\'$mon/$mday ($wday) $hour:$min\"$sec"; |
と、こうなります。真ん中の「'」と「"」に「\」が入ってるのは、 そのままで書くと、ここから文字列だよ〜とか言う事に(エラーに)なるので、 特別な意味を持たないただの文字としての「'」「"」だよという意味で、「\」をつけています。
以上で日付の形式変更は終わりです。各自、自分の好きなように時間を変えましょう。
余談
localtimeで時間を取ると、そのサーバーの時間を取ります。
つまり、もし海外のサーバーなどにおかれていた場合、そこの時間を取ってしまいます。
(海外にサーバーがあっても、日本でしか使用しない場合、日本時間にあわせている場合もあります。)
その時は
localtime(time+1*60*60); |
CGIの改造は個々の責任においてやってください。
私に言われても何もできませんよ。