ゼロと無限の間に

フリーでオープンソースなJavaScriptとかPHPとか。

ユーザ用ツール

サイト用ツール


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

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki