ミスティーネットPerl・CGI講座 パール・CGIレッスン MISTY-NETレンタルサーバー・PERLプログラミング講座 CGI&PERL究極のレシピ
| HOME | ご利用について | 推奨環境 | リンクに関して | 免責/規約 | お問合せ | ミスティーネット | リンク集 |
Perl言語リファレンス

ミスティーネットPerl・CGI講座/基本編
ミスティーネットPerl・CGI講座/基本編
始めに 始めに
変数について 変数について
処理の制御1 処理の制御1
処理の制御2 処理の制御2
配列の処理 配列の処理
ハッシュの処理 ハッシュの処理
数値の扱い 数値の扱い
文字の扱い 文字の扱い
時間の処理 時間の処理
サブルーチン サブルーチン
ファイルの処理 ファイルの処理
ディレクトリの処理 ディレクトリ処理
CGIについて CGIについて
漢字の処理 漢字の処理
    (文字コード)
Cookie の処理 Cookie の処理
正規表現1 正規表現1
正規表現2 正規表現2
演算子について 演算子について
ライブラリ ライブラリ
デバッグ デバック
環境変数について 環境変数
ミスティーネットPerl・CGI講座/基本編

ミスティーネットPerl・CGI講座/応用編
ミスティーネットPerl・CGI講座/応用編
カウンターを作ってみよう カウンターを
     作ってみよう!
ミニゲームを作ってみよう ミニゲームを
     作ってみよう!
ミスティーネットPerl・CGI講座/応用編

ミスティーネットPerl・CGI講座/WEB講座一覧
ミスティーネット
HTML講座 HTML講座
スタイルシート講座 スタイルシート講座
JavaScript講座 JavaScript講座
UNIXコマンド講座 UNIXコマンド講座

ミスティーネット
ラブラブメールでツーショット

人気サイトランキング

人気サイトランキング

8daysランキング

  HOME >> 時間の処理
  1. 現在の日時を取得する
  2. 日時のフォーマット
  3. うるう年を判定する
  4. カウントダウンのプログラムを作る
■ 現在の日時を取得する
現在時刻を取得する為には、time 関数を使います。 time 関数では1970年1月1日0:00からの経過秒数を取得できます。
また、これだけでは扱いづらいのですが、 localtime 関数を使うと年・月・日・曜日・・・など、項目ごとに時間のデータをリスト形式で取り出すことが出来ます。

   → time 関数のリファレンス
   → localtime 関数のリファレンス

取得されたリストデータは、下記のように別々の変数にセットすると扱いやすいでしょう。
取得された値についての詳細は、localtime 関数のリファレンス をご参照ください。


$times = time();
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times);
localtime 関数に直接 time 関数を放り込んでもよいのですが、取得した秒数を別の形で使いたい場合もありますので、ここでは一旦、経過秒数の値を変数にセットしてからその変数を localtime 関数に入れています。


年のデータは、1900年からの経過年を返します(現在が2000年の場合は、100を返します)。
したがって、年のデータに1900をあらかじめ足しておく必要があります。
また、月のデータも同様には 0〜11の値を取得してくるため、あらかじめ1足しておく必要があります。

$year = $year + 1900;    ← 年のデータに1900足す
$mon++;    ← 月のデータに1足す



曜日は 0〜6までの数値で返されます。
このままでは分かりにくいため、下記のように表示したい曜日データを配列に入れておき、 取得された数値を曜日データの配列の添字として扱うことで、曜日を表示できます。

@weekly = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');    ← 表示したい曜日文字
print $weekly[$wday];    ← 曜日を表示
表示したい曜日の文字を配列で扱うと、表示方式を変更したい場合 (Sun → 日曜日)など、この配列の部分のみを変更すればよいため非常に便利です。


タイムゾーンを設定するとグリニッジ標準時からの時間のずれを修正できます。
時間の表示がずれてるな、と思ったときはタイムゾーンを設定してみてください。

タイムゾーンの設定は time 関数で時間を取得する前に設定してください。

$ENV{'TZ'} = "JST-9";    ← 標準時から -9 時間のずれ(日本の場合)
もし、上記を設定しても時間が多少ずれる場合には、「JST-11」 や 「JST-7」 なども試してみてください。




■ 日時のフォーマット
日時を 「2002/02/04 14:43」 などのように決まった書式で出力したい場合には、sprintf 関数を使います。
【書式】
sprintf( %4d, $year );    ← 4桁の数値のフォーマット(例:1922)
sprintf( %04d, $year );    ← 4桁に満たない場合は、足りない桁を0で埋める(例:0039)
sprintf( %s, $charactor );    ← 文字を表示する(例:abc)
sprintf 関数についての詳細は sprint 関数リファレンス をご参照ください。


〔時間の取得から、フォーマットを決めて表示するまでの流れ〕
# 日時の取得 $ENV{'TZ'} = "JST-9";    ← タイムゾーンの設定
$times = time();    ← 時刻を取得
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times); @weekly = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut');    ← 表示したい曜日文字

# 午前・午後の設定
$aft = $hour < 12 ? "AM" : "PM";    ← AM・PMの設定
$hour = $hour > 12 ? $hour - 12 : $hour;    ← 12時間ごとの表示にする

# 日時のフォーマット
$time = sprintf("%04d\/%02d\/%02d\(%s\) %s%02d\:%02d", $year+1900,$mon+1,$mday,$week[$wday],$aft,$hour,$min);
上記スクリプトでは、午前と午後を分ける処理を行なっています。
日時は 「2003/03/12 PM03:23」 という感じで表示されます。
sprintf 関数での 「%04d」 は、4桁の数値を出力するという意味です。
数値が4桁に満たない場合は足りない桁を0で埋めて出力します。
「%s」 は、文字の出力です。





■ うるう年を判定する
うるう年は4の倍数の年に、時間のずれを調整する為、2月の日数を1日増やして29日までとする年です。 4の倍数でも100の倍数の年はうるう年になりません。また、100の倍数でも400の倍数の年の場合はうるう年となります。

下記のスクリプトでは、ユーザーに年のデータを入力してもらい、その年がうるう年かどうかを判定します。

〔サンプルスクリプト〕
# 最初のメッセージを表示する
print "うるう年を判定したい年を入力してください。 => ";

$year = <STDIN>;    ← 入力した値を変数にセットする

# 入力年が0以下の数値の場合は現在の年数で判定する
if ($year <= 0) { $year = (localtime)[4] + 1900; }

# 入力年がうるう年の場合は $flag に 1 をセットする
if ($year % 400 == 0) {    ← 400の倍数年の場合
  $flag = 1;
} elsif ($year % 100 == 0) {    ← 100の倍数年の場合
  $flag = 0;
} elsif ($year % 4 == 0) {    ← 4の倍数年の場合
  $flag = 1;
} else {    ← その他の場合
  $flag = 0;
}

# 結果表示
if ($flag == 1) {
  print "うるう年です。\n";
} else {
  print "うるう年ではありません。\n";
}
exit;





■ カウントダウンのプログラムを作る
カウントダウンを行なう場合には、現在からカウントダウンまでの日時の差分を取得して計算します。
特定日時の経過秒数を取得する場合には、Time::Local モジュールの timelocal 関数を使います。


〔2030年1月1日までの日数〕
use Time::Local;

# 現在の経過秒数とカウントダウンまでの経過秒数を取得する
$t1 = time();
$t2 = timelocal(0,0,0,21,4-1,2003-1900);

# 現在からカウントダウンまでの差分を計算する
$diff = $t2 - $t1;

# 取得した差分の秒数を日時に分割する
$days = int($diff / (3600 * 24));    ← 日数を取得
$diff %= (3600 * 24);
$hours = int($diff / 3600);    ← 時間を取得
$diff %= 3600;
$minutes = int($diff / 60);    ← 分を取得
$diff %= 60;
$sec = int($diff / 60);    ← 秒を取得

# カウントダウン表示
print "カウントダウンの日まであと";
print "$days 日 $hours 時間 $minutes 分 $sec 秒です。";
ここでは、秒まで表示させていますが実際には、日数だけでよいと思います。
また、差分の秒数がマイナスになったときには0を表示するように処理を行なうと、 カウントダウンが終了した後も、マイナスの数値が表示されることがないため、見苦しくないと思います。





← 前のページへ戻る 次のページへ →


| HOME | ご利用について | 推奨環境 | リンクに関して | 免責/規約 | お問い合わせ | ミスティーネット |
(C)Copyright 2002 ミスティーネット Inc. All Right Reserved.