最近の更新

Perl 時刻の処理はとりあえずこれで

time と localtime と tiimelocal にてとりあえずだいたいの用は足せるんじゃないでしょうか。

time

現在の時刻は関数 time で取得できます。それを変数$tm_nowに入れてみます。

$tm_now = time;

これで、変数$tm_nowに1970年1月1日0時0分からの秒数がセットされました。

変数 $tm_now は現在時刻そのものではないですが、でも、それを使って現在時刻が計算できます。

localtime

$tm_now は一応現在時刻のようなものなのですが、1970年1月1日0時0分からの秒数を表しているだけなので、そのままでは現在の年月日はわかりません。

そこで、localtime 関数を使って、年月日時分秒の表示に直してやります。

localtime 関数は年月日時分秒だけでなく、曜日や1月1日からの日数も教えてくれます。

(秒 , 分 , 時 , 日 , 月 , 年 , 曜日 , 日数 )

をという形で教えてくれますので、

($sec,$min,$hour,$day,$month,$year,$wdy,$yday) = localtime($tm);

などとして年月日の値を取得します。これで、8つの変数に年月日などの値がセットされました。

は1900年を足せば普通の西暦になります。

$year += 1900;

は1月=0から始まっているので1を足しましょう。

++$month;

日、時、分、秒 はそのまま使えます。

曜日は以下のようにして漢字に直せます。

@week = ("日","月","火","水","木","金","土");
$youbi = $week[$wdy];

時刻や年月日の表示の形を整えるには以下のような感じでやります。
$current_time = sprintf("%02d時%02d分",$hour,$min);
$current_date = sprintf("%04d\/%02d\/%02d",$year,$month,$day);

%02d は0をつけて2桁で表示を意味します。01 02 ・・・11 ・・・
%2d は2桁表示で頭の0は無し。1 2 ・・・ 11 ・・・

timelocal

さて、localtime で現在年月日、時刻は取得できました。

それから、ある設定した日付を境に処理の内容を変えたいという場合がよくあるじゃないですか?

ある特定の日付と現在の日付を比べて、どちらが過去か未来か判定したいときはどうすればいいでしょうか?

その場合はやっぱり time 形式のほうが都合がいいですよね?

単純に1970年からの経過秒数の大小を比較すればいいだけなので、不等号一つで現在の日付と設定した日付の関係が判定できます。

年月日で比べようとすると、年を比較し、月を比較し、日を比較し、3つも比較しないと判断できません。

そこで便利なのが、timelocal 関数です。

これは文字通り、localtime関数と逆の処理をしてくれます。年月日を入れれば一発で秒数を取得できます。

timelocal (秒 , 分 , 時 , 日 , 月 , 年 );

とすれば、1970/01/01 00:00 からの経過秒数を返してくれます。

例えば2008年12月2日00:00は1970年1月1日00:00から何秒経過しているかは

timelocal (0,0,0,2,11,108);

とすれば取得できますので、その値を現在時刻を表す time と比べてやればいいわけですよね?

 

最後に、

このtimelocal 関数は time とかlocaltime と違って、

use Time::Local;

として最初にモジュールというやつを読み込んでおかないと使えないようです。

私はここでエラーを連発しました。モジュールの意味もここでなんとなくわかりました。

****************

以上です。

これ以外のうまい時刻処理の方法もあるのかもしれませんが、とりあえず以上のような方法で、なんとかなっています。

*********

目次(ホーム)

その他の項目