タイトル

ここは、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);
とすると、時間を合わせられます。
(上の場合だと、60秒×60分×1時間なので、1時間進みます。 timeは秒数で取っているので、直接「time+3600」としてもOKですが、 上の方が見た目でわかりやすいです。)


CGIの改造は個々の責任においてやってください。
私に言われても何もできませんよ。

表紙に行く