phpで日付を扱う時の関数やクラス

プログラマの新里と申します。
今回はphpに存在する日付に関する関数やクラスを紹介してみようと思います。

・date(string format, [, int $timestamp = time()]);
date()は、指定したフォーマットで日付を文字列出力してくれます。
タイムゾーンを設定して、フォーマットを与えるとそのフォーマットの内容で現在時間を返してくれます。

date_default_timezone_set('Asia/Tokyo');// 日本のタイムゾーンを設定。
date('Y-m-d H:m:i'); // 2015-01-01 00:00:00 この様なフォーマットで値が返されます。

date()の第2引数にオプションとしてデフォルトでtime()が設定してあります。
time()は現在時間のタイムスタンプを返すので、現在時間が表示されるという訳です。
オプションに任意のタイムスタンプを設定することで、その値でフォーマット通りの日時を返す事が出来ます。

タイムスタンプは1970/1/1/00:00:00からの通算秒の事で、この値を直接入れるのは大変です。
任意に指定したタイムスタンプを取得するにはstrtotime()を使用します。

・strtotime(string format, [, int $timestamp = time()]);

strtotime()は文字列で与えられた書式をパースし、現在時間からパースした結果の分だけ日時を経過させたタイムスタンプを返します。
$oneDay = strtotime('+1 days'); // 現在時間から1日経過

第2引数には任意のタイムスタンプを引数に与える事で、第2引数のタイムスタンプの日時から、第1引数分経過させた値を返す事も可能です。
strtotime('+1 days', $oneDay); // 現在時間から2日経過したタイムスタンプ

date()とstrtotime()を併用すると
date('Y-m-d H:m:i', strtorime('+1 days')); // 現在時間から1日経過した日時を'Y-m-d H:m:i'で出力
date('Y-m-d H:m:i', strtotime('2015-02-26 01:40:00')); // 2015-02-26 01:40:00


・mktime(int hour, int minite, int second, int month, int day, int year, int is_dst);
このような関数もあります、指定した値のタイムスタンプを取得出来ます。
引数は右から省略可能となり省略すると現在時間の値が入ります。
※ : is_dstとはサマータイムかどうかのフラグになります。
海外ではサマータイムと呼ばれる時間が存在し、通常の時間を1時間進めてしまうというものです。
日本でもサマータイムを実施した事があるそうです。

date('Y-m-d H:m:i', mktime(0, 0, 0, 1, 1, 2015)); // 2015-01-01 00:00:00

基本的にはdate()とstrtotime()で事が済みます。
フォーマットの引数は文字列なので、変数と組み合わせる事も出来たりと便利ですね。
date('Y-m-d H:m:i', strtotime('+' . $value . ' days'));// 現在日時から $value * 日 の値だけ経過させた日時を取得。


phpには、日時と時刻を表すクラスも存在します。

・DateTimeクラス
初期化する際に、引数に有効な書式の文字列を渡すとその値で日時で初期化され、省略すると現在のタイムゾーンでの現在時間で初期化されます。
// コンストラクタで初期化
$dateTime = new DateTime('2015-02-26 01:40:00');
// DateTimeを返す関数もあります
$dateTime = date_create('2015-02-26 01:40:00'); 
// 初期化後、セット関数を使用
$dateTime = new DateTime();
$dateTime->setDate(2015, 2, 26)->setTime(1, 40, 0);

date()やstrtotime()には無い機能として、初期化時のフォーマットに独自のものを利用出来ます。
文字列を組み合わせたい場合等に便利ですね。
$myFormat = 'Y年m月d日 H時i分s秒';
$dateTime = DateTime::createFromFormat($myFormat, '2015年02月26日 01時40分00秒');
DateTimeクラスから日時を出力する場合はformat()を呼びます。
$dateTime->format('Y-m-d H:m:i');
// date()とstrtotime()を使用する場合はこちら
date('Y-m-d H:m:i', strtotime(2015-02-26 01:40:00));

strtotime()で使用した様な書式による日時取得もmodify()を使用する事で取得出来ます。
$dateTime->modify('+1 days')->format('Y-m-d');
// date()とstrtotime()を使用する場合はこちら
date('Y-m-d H:m:i', strtotime('+1 days'));


・DateTimeImmutableクラス
クラスの挙動としてはDateTimeクラスと同じです。
ただ、値を返す際には自分自身は更新せず新しいDateTimeオブジェクトを返すという挙動を取ります。
つまり設定値が変更されませんので、固定時間からの差分取得したいという時に便利です。
DateTimeは自分自身の値を更新し、自身の参照を渡すので使い分けには注意が必要ですね。

一時的に日時を計算するだけであれば、date()とstrtotime()で事足りますが、
初期化すればDateTimeクラスは各関数を呼び出す度に参照を返すので、その参照からまた関数を立て続けに呼びせばコードが複数行になってしまうなんて事も無さそうです。
クラスである事が扱いやすく分かりすいと考える場合は、DateTimeクラスやDateTimeImmutableクラスを利用するのも良いですね。

最後に、タイムスタンプを利用する場合には2038年問題というものが存在します。
32bitシステム上ではタイムスタンプが扱えるのは2038年までというものです。
2038年を超えると1970年に戻ってしまう訳です。
ですが、64bitシステム上であれば、過去未来2930億年まで対応できます。スゴイ

採用情報

クラウドクリエイティブスタジオではプログラマを募集中でございます。
ご興味があれば、以下のリンクをご覧くださいませ。



コメント