php-tool-box:smart-date
PHPのDateTimeオブジェクトをもう少し便利に改造した - Smart Date
PHPには標準関数として日付関連・日時関連の関数がたくさんあり、使いこなせば便利なのだがまとまりがない。
それをまとめるべくPHP5.2からはDateTimeクラスが登場した。これはこれで便利なのだが、冗長な割に痒いところに手が届かないと感じることがある。
その結果、PHPで日時を扱うときは必要に応じてDateTimeを拡張したりオレオレDateクラスを作ったりすることになる。
それはそれで楽しくはあるがここは1つ生産性を挙げるために、割と汎用的でそこそこ便利な感じにDateTimeクラスを拡張してみることにした。
ライセンス
MITライセンス
使い方の例
$date = new SmartDate(2011, 12, 31); //そのまま文字列にCASTできる echo $date; // => 2011-12-31 //フォーマット文字列の中に"youbi"と入れると、曜日も表示できる echo '大晦日は' . $date->format('Y/m/d (youbi)'); // => 大晦日は2011/12/31 (土) //時刻まで指定すると、デフォルトで時刻も表示する echo new SmartDate(2011, 12, 31, 1, 2); // => 2011-12-31 01:02:00 //存在しない日付は例外を投げる try { new SmartDate(2011, 2, 29); } catch (Exception $e) { echo $e->getMessage(); // => Invalid date 2011, 2, 29 } //間違った時刻も例外を投げる try { new SmartDate(2011, 12, 31, 0, 0, 61); } catch (Exception $e) { echo $e->getMessage(); // => Invalid time 0, 0, 61 } /* 日付・時刻の妥当性チェックのみしたい場合 */ //日付のValidate var_dump(SmartDate::isValidDate(2012, 2, 29)); // => bool(true) var_dump(SmartDate::isValidDate(2100, 2, 29)); // => bool(false) //時刻のValidate var_dump(SmartDate::isValidTime(1, 2, 3)); // => bool(true) var_dump(SmartDate::isValidTime(1, 61, 3)); // => bool(false) /* いろいろな生成方法 */ //年、月、日をそれぞれ指定 echo new SmartDate(2012, 12, 31); // => 2012-12-31 //年、月、日、時、分をそれぞれ指定 echo new SmartDate(2012, 12, 31, 1, 2); // => 2012-12-31 01:02:00 //年、月、日、時、分、秒をそれぞれ指定 echo new SmartDate(2012, 12, 31, 1, 2, 3); // => 2012-12-31 01:02:03 //日時を表す文字列(対応する日時の表現はDateTimeと同じ) echo new SmartDate('2012/12/31'); // => 2012-12-31 00:00:00 echo new SmartDate('2012-12-31 01:02:03'); // => 2012-12-31 01:02:03 echo new SmartDate('201212310102'); // => 2012-12-31 01:02:00 echo new SmartDate('20121231010203'); // => 2012-12-31 01:02:03 //Unixタイムスタンプ echo new SmartDate(1300000000); // => 2011-03-13 16:06:40 //パラメータなし(現在の日時になる) echo new SmartDate();
ソースコード
<?php /** * Smart Date * @version 0.1.0 * @see http://0-oo.net/sbox/php-tool-box/smart-date * @copyright 2011 dgbadmin@gmail.com * @license http://0-oo.net/pryn/MIT_license.txt (The MIT license) */ class SmartDate extends DateTime { private $_hasTime = true; /** * 日付を検証 */ public static function isValidDate($y, $m, $d) { return $y && $m && $d && preg_match('/^\d+$/', $y . $m. $d) && checkdate($m, $d, $y); } /** * 時間を検証 */ public static function isValidTime($h, $i, $s) { return preg_match('/^([01]?\d|2[0-3])$/', $h) && preg_match('/^[0-5]?\d$/', $i) && preg_match('/^[0-5]?\d$/', $s); } /** * コンストラクタ * パラメータの渡し方は下記のいずれか * ・年、月、日をそれぞれ指定 * ・年、月、日、時、分をそれぞれ指定 * ・年、月、日、時、分、秒をそれぞれ指定 * ・日時を表す文字列(対応する日時の表現はDateTimeと同じ) * ・Unixタイムスタンプ * ・パラメータなし(現在の日時になる) */ public function __construct($y = null, $m = null, $d = 0, $h = null, $i = 0, $s = 0) { if (is_null($y)) { $str = null; } else if (is_null($m)) { if (strToTime($y)) { //文字列表現の日時を渡された場合 $str = $y; } else if (is_numeric($y)) { //タイムスタンプを渡された場合 $str = date('Y-m-d H:i:s', $y); } else { throw new Exception("Invalid date(time) $y"); } } else { if (is_null($h)) { $h = 0; $this->_hasTime = false; } if (!self::isValidDate($y, $m, $d)) { throw new Exception("Invalid date $y, $m, $d"); } else if (!self::isValidTime($h, $i, $s)) { throw new Exception("Invalid time $h, $i, $s"); } $str = "$y-$m-$d $h:$i:$s"; } parent::__construct($str); } /** * 指定した書式でフォーマットした日時を返す * 日本の曜日を表示したい場合は、"youbi"を使う */ public function format($f = null) { if (is_null($f)) { $f = 'Y-m-d'; if ($this->_hasTime) { $f .= ' H:i:s'; } } else { $week = array('日', '月', '火', '水', '木', '金', '土'); $f = str_replace('youbi', $week[parent::format('w')], $f); } return parent::format($f); } /** * 文字列化 */ public function __toString() { return $this->format(); } }
php-tool-box/smart-date.txt · 最終更新: 2011/04/17 22:50 by dgbadmin