SOFTELメモ

Softel Inc.

【php】DateTimeクラスで日付の表示の補正をおこなう

問題

ある文字列が与えられたとき、正しい日付ならば、date(‘Y年m月d日’)のように形式を自由に指定して日付形式の文字列として表示したい。

// 例
dateFormat('2012-01-02', 'Y/m/d'); → 2012/01/02
dateFormat('2012-01-02', 'Y年n月j日'); → 2012年1月2日
dateFormat('2012/1/2', 'Y-m-d'); → 2012-01-02

dateFormat('日付の形をしていない文字列', 'Y-m-d'); → ''(空文字)
dateFormat('2012/02/33', 'Y-m-d'); → ''(空文字)
dateFormat('0000-00-00', 'Y-m-d'); → ''(空文字)
dateFormat('', 'Y-m-d'); → ''(空文字)

calendar

答え

タイムスタンプを使うとこんな感じ。

function dateFormat($d, $f = null, $e = null)
{
	//デフォルトの形式
	if ($f == null) {
		$f = 'Y-m-d';
	}

	//文字列を日付として解釈してみる
	if ($t = strtotime($d)) {
		return date($f, $t);
	} else {
		return $e;
	}
}

タイムスタンプだと範囲に限度があるので、DateTimeクラスを使うとこんな感じ。

function dateFormat($d, $f = null, $e = null)
{
	//デフォルトの形式
	if ($f == null) {
		$f = 'Y-m-d';
	}

	if ($d == '0000-00-00' || $d == '0000-00-00 00:00:00' || $d == '') {
		//MySQLなどにありがちな文字列はここで対応
		return $e;
	} else {
		//文字列を日付として解釈してみる
		try {
			$date = new DateTime($d);
			return $date->format($f);
		} catch (Exception $_) {
			return $e;
		}
	}
}

MySQLなどで、’0000-00-00’などの日付が発生するが、DateTimeさんは’0000-00-00’を渡してもエラーを出さない。new DateTime(‘0000-00-00’) → -0001年11月30日になる。

上のように場合分けをするか、DateTimeクラスをextendsして自前の日付処理クラスを作って対応する。

タイムスタンプでも、64bit版OSの場合かなり未来まで対応でき、負のタイムスタンプも使用可能な環境では、過去の方向にもかなり過去まで対応できる様子で、そういった環境ではタイムスタンプを使っても大丈夫かもしれない。

速度について

処理時間を比較すると、strtotime方式が3に対して、DateTimeクラス方式が4かかる程度の差で、さほど違わないので、DateTimeクラス方式が無難なところでしょう。

参考

http://www.php.net/manual/ja/datetime.construct.php

関連するメモ

コメント