アナログCPU:5108843109

ゲームと音楽とプログラミング(酒と女とロックンロールのノリで)

('ω') < イザユケエンジニャー

日時を扱ういろいろ PHP版

PHPでの日時の扱いについてですが、INT型のUnixタイムスタンプを用いるのが基本です。

例えば現在の日時を「YYYY-MM-DD hh:mm:ss」という形で求める場合、

$datetime = date("Y-m-d H:i:s", time())

とします。
time()で現在のUnixタイムスタンプを取得し、それを指定のフォーマットに変換しています。

フォーマットした日付文字列をつくる

date(フォーマット,Unixタイムスタンプ)を使用。
上記の説明のとおりですが、現在日時の場合はUnixタイムスタンプの指定を省略してもOKです。
フォーマットのパラメータに使用できる文字はマニュアルの通りですが、
個人的によく使用するものをこちらに挙げておきます。

Y 年(西暦4桁)
y 年(西暦下2桁)
m 月(先頭ゼロ埋めする)
n 月(先頭ゼロ埋めしない)
d 日(先頭ゼロ埋めする)
j 日(先頭ゼロ埋めしない)
N 曜日(1:月曜 2:火曜 … 7:日曜)
w 曜日(0:日曜 1:月曜 … 6:土曜)
t 該当する月の日数(=末日)
H 時(24時間方式)
i
s

「t」が意外と便利。末日を取りたければ「Y-m-t」のフォーマットでOK。便利。

各要素をバラバラに取りたい場合であればgetdateが使いやすい場面もあるかも。

また、月だけ・日だけ…などを文字列ではなく数値として取りたい場合にはidateなんて関数もあります。
どうしても型を意識しなければならない場合には使える…かも?
(見慣れない関数入れるよりも、dateで取ってキャストした方が可読性高い気がしますが…)

参考
PHP: getdate - Manual
PHP: idate - Manual

日付からUnixタイムスタンプを取得する(1)

mktime(時, 分, 秒, 月, 日, 年, サマータイムかどうか) を使用するパターン。
引数は右から順に省略可能で、すべて省略した場合は現在時刻となります。
ただし、現在時刻を求める場合はtime()を使用すべきです。
(PHP5.1以降では、引数をすべて省略した場合noticeが出るようです)

引数はすべて整数で渡します。
範囲外の数字はPHPで判断して処理してくれます。
例えば月に13を指定すると繰り越して「1月」としてくれたり、
月に1、日に0を指定すると「12月31日」としてくれたりします。

// 例
$date = date("Y-m-d", mktime(0, 0, 0, 11, 31, 2013)); // 2013-12-01

日付からUnixタイムスタンプを取得する(2)

strtotime(日付文字列) を使用するパターン。
日付文字列には色々なものを入れられます。

// 例
$timestamp = strtotime("now");               // time()で充分ですが…
$timestamp = strtotime("2013-11-01");        // 普通の日付
$timestamp = strtotime("01 November 2013");  // 海外式
$timestamp = strtotime("-1 day");            // 昨日の日付
$timestamp = strtotime("2013-11-01 -1 day"); // 2013/11/01の前日
$timestamp = strtotime("+1 week");           // 1週間後
$timestamp = strtotime("+1 month");          // 1ヶ月後
$timestamp = strtotime("+1 year");           // 1年後
$timestamp = strtotime("+1 hour");           // 1時間後
$timestamp = strtotime("+1 minute");         // 1分後
$timestamp = strtotime("+1 second");         // 1秒後
$timestamp = strtotime("next Monday");       // 次の月曜日
$timestamp = strtotime("last Sunday");       // 前の日曜日

…何でもアリですね。これがPHPの楽しいところでも便利なところでも怖いところでもあるというか…

「1日後」「1時間後」ならともかく、「1ヶ月後」なんかは意図した日付になるとは限らないので注意が必要。

参考
d.hatena.ne.jp

日付が有効かどうかを調べる

checkdate(月, 日, 年) を使用。
有効な場合はTRUE、無効な場合はFALSEが返ってくる。

// 例
$result = checkdate(12,31,2013)  // true
$result = checkdate(12,32,2013)  // false