![]() |
|||
| | HOME | ご利用について | 推奨環境 | リンクに関して | 免責/規約 | お問合せ | ミスティーネット | リンク集 | | |||
|
HOME >> 時間の処理
■ 現在の日時を取得する
現在時刻を取得する為には、time 関数を使います。
time 関数では1970年1月1日0:00からの経過秒数を取得できます。 また、これだけでは扱いづらいのですが、 localtime 関数を使うと年・月・日・曜日・・・など、項目ごとに時間のデータをリスト形式で取り出すことが出来ます。 → time 関数のリファレンス → localtime 関数のリファレンス 取得されたリストデータは、下記のように別々の変数にセットすると扱いやすいでしょう。 取得された値についての詳細は、localtime 関数のリファレンス をご参照ください。
$times = time();
localtime 関数に直接 time 関数を放り込んでもよいのですが、取得した秒数を別の形で使いたい場合もありますので、ここでは一旦、経過秒数の値を変数にセットしてからその変数を localtime 関数に入れています。
($sec,$min,$hour,$mday,$month,$year,$wday,$stime) = localtime($times); 年のデータは、1900年からの経過年を返します(現在が2000年の場合は、100を返します)。 したがって、年のデータに1900をあらかじめ足しておく必要があります。 また、月のデータも同様には 0〜11の値を取得してくるため、あらかじめ1足しておく必要があります。
$year = $year + 1900; ← 年のデータに1900足す $mon++; ← 月のデータに1足す 曜日は 0〜6までの数値で返されます。 このままでは分かりにくいため、下記のように表示したい曜日データを配列に入れておき、 取得された数値を曜日データの配列の添字として扱うことで、曜日を表示できます。
@weekly = ('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sut'); ← 表示したい曜日文字
表示したい曜日の文字を配列で扱うと、表示方式を変更したい場合 (Sun → 日曜日)など、この配列の部分のみを変更すればよいため非常に便利です。
print $weekly[$wday]; ← 曜日を表示 タイムゾーンを設定するとグリニッジ標準時からの時間のずれを修正できます。 時間の表示がずれてるな、と思ったときはタイムゾーンを設定してみてください。 タイムゾーンの設定は time 関数で時間を取得する前に設定してください。
$ENV{'TZ'} = "JST-9"; ← 標準時から -9 時間のずれ(日本の場合)
もし、上記を設定しても時間が多少ずれる場合には、「JST-11」 や 「JST-7」 なども試してみてください。
■ 日時のフォーマット
日時を 「2002/02/04 14:43」 などのように決まった書式で出力したい場合には、sprintf 関数を使います。
【書式】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を表示するように処理を行なうと、 カウントダウンが終了した後も、マイナスの数値が表示されることがないため、見苦しくないと思います。
|
|||||||||||||||||||||||||||||||||||||||