[PHP]日本語対応の日付を整形する関数、mb_date()

Read More

先日のmb_strtotime()に関連する続き。


今日はdate()を改良した自作関数でmb_date()ってのを公開してみる。

これはdate()の使い勝手を拡張したもの。


どこを拡張したかというと、date()の第1引数で指定できるフォーマット文字列部分。

フォーマット文字列とは文字列内でオプション名を指定すると、それに見合った変換をしてくれるというもの。


具体的例を記す。

■date()のフォーマット例
<?php
echo date('Y/m/d H:i:s');
?>


とすると

■実行結果
> 2011/06/29 17:50:52


という文字列を返してくれる。



このdate()は便利で使う事が多いんだけど、一つだけ足りないものがあった。

それは日本語の曜日と直に対応したものがない。


そう、Dオプションだと英単語の省略系の文字が返ってくるし、jオプションだと英単語そのものが返ってくる。

wオプションだと日曜日から土曜日までに対応した数値0~6が返される。


日本語の"日"~"土"を返してくれるようなオプションはない。

これは困る。



そこで作ったのが以下の関数

■自作関数mb_date()
/**
 * date()を拡張した関数
 * フォーマットに"x"(日本語の曜日に対応)を指定できる。
 * @param  string $sFormat
 * @param  string $sTimestamp
 * @return string $sReturn
 */
function mb_date($sFormat='Y/m/d H:i:s', $sTimestamp=null) {
 if(!isset($sTimestamp)) {
  $sTimestamp = time();
 }// end if

 $add = (1*60*60*9); // 9時間(秒)
 $sTimestamp = (int)$sTimestamp + $add;

 $sReturn = gmdate($sFormat, $sTimestamp);
 $aryDayType = array(0=>'日', 1=>'月', 2=>'火', 3=>'水', 4=>'木', 5=>'金', 6=>'土');
 $x = $aryDayType[gmdate('w', $sTimestamp)];
 $sReturn = preg_replace('/[x]/u', $x, $sReturn);

 return $sReturn;
}// end function



これを使うと新たなフォーマット文字列のオプションとして"x"が使えるようになる。


■実行例
<?php
echo mb_date('Y/m/d (x) H:i');
?>



■実行結果
> 2011/06/29 (水) 17:55



xオプションが使えるようになったこと以外でdate()と違う点は、
GMTを利用して日本時間を算出している点。

まあこれは普通に使う分には何も意識せずとも問題にはならんだろう。
そしてこれが良いか悪いかは好みによる。


他には、第2引数がnoth(値が未指定の時)、又はnullの場合はデフォルトとして当日のタイムスタンプが入る点。
# ここでいうnothとはnothingのことで、メモリ上から破棄された状態を指す

元々のdate()は第2引数がnothの場合のみ当日のタイムスタンプが入り、nullだとfalseが返る、はず。

ここの挙動をまったく同じにすることは、今のPHPでnothとnullを判別する方法がない以上不可能。



あと第1引数のデフォルト値に"Y/m/d H:i:s"が指定してあるのは、フォーマットを忘れないようにする為と、ある限定された条件の時のみに利用する為。
# 限定された条件はここでは説明しないが

普段利用する時は、date()よろしく必ずフォーマット文字列を指定した方がよい。





--
おまけ。


PHP関数を自分で拡張したような自作関数を作る際は、なるべく元の関数と挙動は合わせた方が良い。

その方が後から使う者にとって利用しやすいから。

オリジナルな挙動をされるといちいちそれも把握しとかんといけんくなるので。