時間に関連する関数はたくさんあるので、その使い方をまとめておきます。
今現在(2010年3月)は、1268115574秒ということになっていてこの先も増えつづけます。このエポックスタンプは2038年問題としてこの先大いに問題視されることになりますが、2038年には32ビット整数が目一杯になってしまうんですね。それ以上の秒積算ができなくなる。64ビットに変換することでその未来はそうとうに長い間そのような問題が起きないとされていますが、この先どうなるんでしょうか。とはいえ、伝統的にエポックスタンプを避けることができない(本当はできますが)ので私も使用していますし、これらか先もまだまだ使われることになると思います。
date()関数のフォーマット文字は以下のようになります。
つまり、
$epock_stamp = mktime(16,42,55,3,0,2010);
返されるエポックスタンプは、2010年2月28日、16時42分55秒のものとなり、つまり指定月の前日(前の月の末日)を返してくれます。月の終わりにばらつきのあるカレンダーなのでこの機能を使うと月の末尾を求めることができます。
しかしこの0を指定する際にはいくつか面倒な約束があるのでまとめておきます。
エポックスタンプを返す
エポックスタンプとかエポック秒とか言い方をしますが、1970年1月1日0:00 00から現在の時間までを秒で積算したものです。今現在(2010年3月)は、1268115574秒ということになっていてこの先も増えつづけます。このエポックスタンプは2038年問題としてこの先大いに問題視されることになりますが、2038年には32ビット整数が目一杯になってしまうんですね。それ以上の秒積算ができなくなる。64ビットに変換することでその未来はそうとうに長い間そのような問題が起きないとされていますが、この先どうなるんでしょうか。とはいえ、伝統的にエポックスタンプを避けることができない(本当はできますが)ので私も使用していますし、これらか先もまだまだ使われることになると思います。
$epock = time();time()関数で現在のエポックスタンプを返します。マイクロ秒(0.000 001秒)という精度の高い秒数を返したい場合は、microtime()関数を使います。殆ど必要を感じませんが...。
$micro = microtime();
日付を取得する
最もベーシックな日付のとり方がこれです。$epock = time();date()関数はエポックスタンプを引数にしてフォーマットしてあげると現在の日付が出てきます。2010.03.09 PM 15:32.55という形式で返されますが、これらのフォーマットはいろいろ変えられます。(順番をバラバラにしてもきちんとフォーマットして出力されます。(sun) 03 17:35 2009 ...とか。こんなフォーマット役に立ちませんが...。)
$date = date('Y.m.d A H:i.s',$epock);
Y/m/d H:i:s → 2003/04/12 15:44:12面倒なのが日本語の曜日表示です。日本語の曜日をデフォルトで表示する機能がないので(PHPも所詮外国産ですので)、曜日を番号で表示するフォーマットなどを使って日本語に変換してやる必要があります。
Y.m.d A H:i.s → 2010.03.09 PM 15:32.55
Y年m月d日 H時i分s秒 → 2003年04月12日 15時44分12秒
日本語で曜日を出力する
$epock = time();こんな感じですかね。
$now_date = date('Y.m.d',$epock_time);
$now_time = date('A H:i.s',$epock_time);
$wday = date('w',$epock_time);
$weekday_array = array('日','月','火','水','木','金', '土');
$wday = $weekday_array[$wday];
$date = "$now_date ($wday) $now_time";
print $date."<br />\n";
2010.03.09 (火) PM 15:53.20
date()関数のフォーマット文字は以下のようになります。
| Format | 解説 |
|---|---|
| a | "am"または"pm"。 |
| A | "AM"または"PM"。 |
| d | 日。2桁の数字(先頭にゼロが付く場合も)。"01"から"31"まで。 |
| D | 曜日。3文字のテキスト形式。"Mon"。 |
| F | 月。テキスト形式。長い形式。"January"。 |
| h | 時。12時間単位。"01"から"12"。 |
| H | 時。24時間単位。"00"から"23"。 |
| g | 時。12時間単位。先頭にゼロを付けない。"1"から"12"。 |
| G | 時。24時間単位。先頭にゼロを付けない。"0"から"23"。 |
| i | 分。"00"から"59"。 |
| j | 日。先頭にゼロを付けない。"1"から"31"。 |
| l('L'の小文字) | 曜日。例えば"Monday"。 |
| L | 閏年であるかどうかを表す論理値。"0"または"1"。 |
| m | 月。"01"から"12"。 |
| n | 月。先頭にゼロを付けない。"1"から"12"。 |
| M | 月。3文字のテキスト形式。例えば"Jan"。 |
| s | 秒。"00"から"59"。 |
| S | 英語形式の序数を表すサフィックス。2文字。"th"や"nd"。 |
| t | 指定した月の日数。"28"から"31"。 |
| T | このマシンのタイムゾーンの設定。例えば"MDT"。 |
| U | Unix時(1970年1月1日)からの秒数。 |
| w | 曜日。数値。"0"(日曜)から"6"(土曜)まで。 |
| Y | 年。4桁の数字。例えば"2003"。 |
| y | 年。2桁の数字。例えば"03"。 |
| z | 年間の通算日。"0"から"365"。 |
| Z | タイムゾーンのオフセット秒数("-43200"から"43200")。 |
日付からエポックスタンプを取得する
エポックスタンプから日付を取得できたら、今度は日付からエポックスタンプを取得する方法です。他のファイルにある日付などのデータをPHPで扱う際には一度エポックスタンプに戻した方が計算しやすいということもあるので、これを覚えておかなくてはということです。$epock_stamp = mktime(<時>,<分>,<秒>,<月>,<日>,<年>);これで取り出せます。ややこしいのが「年月日時分秒」という並びじゃないことです。これは、例えば、mktime(<時>,<分>,<秒>);とやってあげるとその日の指定時間のエポックスタンプが返るという高機能が装備されているからです。
つまり、
mktime(<時>,<分>,<秒>); 現在の日付の指定時分秒を返すという風になります。省略した引数に関してはすべて現在の時間が返るというわけです。また存在しない日付の設定を引数としてもきちんとエポックスタンプを返してくれます。例えば3月0日を指定すると、
mktime(<時>,<分>,<秒>,<月>,<日>); 現在の年の指定月日、時分秒を返す
...
$epock_stamp = mktime(16,42,55,3,0,2010);
返されるエポックスタンプは、2010年2月28日、16時42分55秒のものとなり、つまり指定月の前日(前の月の末日)を返してくれます。月の終わりにばらつきのあるカレンダーなのでこの機能を使うと月の末尾を求めることができます。
しかしこの0を指定する際にはいくつか面倒な約束があるのでまとめておきます。
| 引数 | 結果 |
|---|---|
| mktime(x,x,x,3,0,2010); | 日付を0にすると2010年3月の前の月(2月)の末日を算出する(時間はそのままでx:xx,xx) |
| mktime(x,x,x,10,5,0); | 年を0にすると(どうしてだか...)2000年を返す。(その他はそのままなので2000,10,5) |
| mktime(x,x,x,0,9,2010); | 月を0にすると前の年(2009年)を返す。2009年12月9日を返す。 |


