※このサンプルの解説は、「CGI(Perl)の解説」をすべて読み終えてる方を前提としています。

■ 時間関数について(localtime、timeなど)

Perlで日付・時刻などを扱うには時間関数を使用します。

時間関数には次のようなものがあります。

time()

現在の時刻(日付・時間)を取得します
ただし、値は1970年1月1日 00:00:00 UTCからの秒数を返します
Macの場合、1904年1月1日 00:00:00からの秒数です
※UTC..協定世界時間(詳しいことはネットで調べてください。

gmtime()

time関数形式の時間をグリニッジ標準時に変換します
通常は、「Fri Mar 25 02:50:36 2005」のような書式で左から順に
曜日の英字3文字(Sun、Mon、Tue、Wed、Thu、Fri、Sat)
月の英字3文字(Jan、Feb、Mar、Apr、May、Jun、Jul、Aug、Sep、Oct、
    Nov、Dec)
日(1〜31)
時:(0〜23)
分:(0〜59)
秒:(0〜59)
年:標準書式の場合、正しい西暦年が表示される

です。

また、リスト形式で取得する場合は、
「($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) 」
ような記述で取得し、この場合は左から順に
秒:(0〜59)
分:(0〜59)
時:(0〜23)
日:(1〜31)
月:(0〜11)
年:西暦1900年が基準で、2000年は100となる
曜日:(0〜6)日曜日が0
日数:その年の1月1日からの経過日数で、1月1日は0
夏時間調整:(0〜1)サマータイムの時1 (詳しい情報がありません)

となります。

localtime()

time関数形式の時間をローカル時間に変換します
※使用方法は「gmtime()」関数と同じです

上記の関数は言葉で説明するよりサンプルを見てもらったほうが解かりやすいと思います。

【 解    説 】

まず、現在の時刻を秒数で取得するには「time」関数を使い次のように記述します。
print time;

これをローカル時間に変換するには「localtime()」関数を使い次のように記述します。
print localtime(time);

なお、「localtime()」関数のパラメータは省略でき、省略した場合は現在の時刻(「time」)を使用します。

次にこれらを定型書式ではなく、自分が指定した書式にしたい場合は、「localtime()」を次のようなリスト形式で受けます。
($sec, $min, $hour, $mday, $mon,     $year, $wday, $yday, $isdst) = localtime();

受けたそれぞれの変数をそのまま表示する場合は、次のような記述になります。
print "$year $mon $mday $hour $min $sec";

その結果は次のように表示されます。
105 2 25 11 23 32

しかし、これではいくつか問題が残ります。
1.年が1900年を基準にしているので1900を加算しないといけない。
2.月が0スタートとなっているので1を加算しないといけない。
3.数字だけの羅列では解かりにくい。

などです。

そこでこれら3つのことをバラバラで行うのではなく一度に(1行で)処理できればなぁ..と思いますよね?
そこで登場するのがフォーマット(書式整形)関数「sprintf()」です。

「sprintf()」を使えば、受けたそれぞれの変数を計算させると同時に、指定した書式に整形する事ができます。
その方法は次のように記述します。

print sprintf("%04d/%02d/%02d %02d:%02d:%02d" , $year+1900,$mon+1,$mday,$hour,$min,$sec);
※詳しくは「フォーマット(書式整形)関数(sprintf)」を参照してください。

ただ、これだと長すぎて解かりにくいので、私は次のように、2行に記述します。
$fmt0 = "%04d/%02d/%02d %02d:%02d:%02d"; print sprintf($fmt0, $year+1900,$mon+1,$mday,$hour,$min,$sec);

次に曜日の取得ですが、英字のままでよいなら次のように標準書式の頭3文字が使えます。
print substr(localtime, 0, 3);

しかし、日本語で表示したいとなるとちょっとした変換ルーチン(処理)を組み込まないとできません。
その方法は「曜日を日本語で表示したい」で解説しています。

では、時間関数の使い方を確認するために次のようなサンプルを作ってみました。

下記のサンプルでの注意点は3箇所です。
1.1行目の「#!/usr/bin/perl」はサーバーによって違いますので確認してください。
2.表示文字列の最後にある「<br>\n」はそれぞれのHTMLの改行とテキストファイルの改行です。
3.「spintf」フォーマット(書式指定)関数で「フォーマット(書式整形)関数(sprintf)」で解説しています。

【記述サンプル】
#!/usr/bin/perl print << "END_DOC"; Content-type:text/html\n\n <HTML> <HEAD> <title>時間関数のテスト</title> </HEAD> <BODY> END_DOC print "time = ".time."<br>\n"; print "gmtime(time) = ".gmtime(time)."<br>\n"; print "gmtime() = ".gmtime()."<br>\n"; print "gmtime = ".gmtime."<br>\n"; print "localtime(time) = ".localtime(time)."<br>\n"; print "localtime() = ".localtime()."<br>\n"; print "localtime = ".localtime."<br>\n"; print "(localtime)[$i] = "; for($i = 0;$i <= 8;$i++){ $tim0 = (localtime)[$i]; print "$tim0 "; } print "<br>\n"; ($sec, $min, $hour, $mday, $mon,     $year, $wday, $yday, $isdst) = localtime(); print "$year $mon $mday $hour $min $sec = "; print "$year $mon $mday $hour $min $sec<br>\n"; $fmt0 = ""%04d/%02d/%02d %02d:%02d:%02d\""; print "$fmt0 = $fmt0<br>\n"; print "sprintf($fmt0, $year+1900,$mon+1,$mday,$hour,$min,$sec) = "; $fmt0 = "%04d/%02d/%02d %02d:%02d:%02d<br>\n"; print sprintf($fmt0, $year+1900,$mon+1,$mday,$hour,$min,$sec); print "substr(localtime, 0, 3) = ".substr(localtime, 0, 3)."<br>\n"; print << "END_DOC"; </BODY> </HTML> END_DOC
◆実行結果について

上記のサンプルを「time.cgi」という名前で保存して実行してみてください。

実行結果はこちらをクリックしてください。
なお、実行結果については、各々のサーバーの環境、ユーザーの環境にによって内容は変わってきます。


page update:2010/01/23 20:32

Copyright (c) 2000-2009, all Rights Reserved & Produced by atom