SYSTEM238 / NOTES1 / Smarty3関連 / Smarty3の簡易日付整形修飾子

NOTES1 PROG1
Smarty3の簡易日付整形修飾子
Smarty3のdate_format修飾子は値がUnixタイムスタンプじゃないと使えない。DBから取得した値が"2011-10-12 17:17:12.1234"という様な日付文字列だと使いづらいので対応策を作った。

この修飾子を作った経緯

Smarty3には日付整形のために「date_format修飾子」が用意されています。内部的にはPHPの strftime()関数のラッパのようです。

この「date_format修飾子」はテンプレート(デザイン)側で日付を色々と整形できて便利なんですが、修飾対象の値はUnixタイムスタンプでなければいけません。

DBで定義されている項目が日時型(PostgreSQLのTIMESTAMP型やMySQLのDATETIME型なんか)で定義されている場合、PHPで普通に値を取り出すと "2011-10-12 17:17:12.1234"のように「日付を示す文字列」が返ってきます。

この値を「date_format修飾子」で使用するためにはUnixタイムスタンプに変換してからSmartyに渡す必要があります。

意外と面倒ですよね。

そこで、"2011-10-12 17:17:12.1234"のような「日付を示す文字列」を直接整形する修飾子をつくりました。

作った修飾子

[modifier.s238_ts_fmt.php]
<?php
/**
 * タイムスタンプ編集
 * @access public
 * @param  string  $value DBから得られたタイムスタンプ値
 * @param  string  $opt   フォーマット種別 設定値はソースの「出力」以降を参照
 */
function smarty_modifier_s238_ts_fmt($value, $opt)
{
    if ($value == '') return '';

    list($ymd, $time) = explode(' ', $value);


    if     ($opt == 'D'){
        // 日付をそのまま
        return $ymd;

    }elseif ($opt == 'T'){
        // 時刻をそのまま
        return $time;

    }elseif ($opt == '/'){
        // 日付を'/'区切り
        return strtr($ymd, array('-'=>'/'));

    }elseif ($opt == '2/'){
        // 日付(年2桁)を'/'区切り
        return substr(strtr($ymd, array('-'=>'/')), 2);

    }elseif ($opt == ':'){
        // 時刻を':'区切り
        return substr(strtr($time, array('.'=>':')), 0, 8);

    }elseif ($opt == '/:'){
        // 日時を'/:'区切り
        return strtr($ymd, array('-'=>'/')). ' '. substr(strtr($time, array('.'=>':')), 0, 8);
    }
}


/* 時刻を':'区切り */         elseif  ($opt == ':'){  return substr(strtr($time, array('.'=>':')),    0, 8);}
/* 日時を'/:'区切り */            elseif  ($opt == '/:'){ return strtr($ymd, array('-'=>'/')) . ' ' . substr(strtr($time, array('.'=>':')),0, 8);}

実行例

[smartyの記述]
{$str='2011-10-12 17:17:12.1234'}
{$str} //オリジナル
{$str|s238_ts_fmt:'D'}  //日付をそのまま
{$str|s238_ts_fmt:'T'}  //時刻をそのまま
{$str|s238_ts_fmt:'/'}  //日付を'/'区切り
{$str|s238_ts_fmt:'2/'} //日付(年2桁)を'/'区切り
{$str|s238_ts_fmt:':'}  //時刻を':'区切り
{$str|s238_ts_fmt:'/:'} //日時を'/:'区切り

[実行結果]
2011-10-12 17:17:12.1234 //オリジナル
2011-10-12               //日付をそのまま
17:17:12.1234            //時刻をそのまま
2011/10/12               //日付を'/'区切り
11/10/12                 //日付(年2桁)を'/'区切り
17:17:12                 //時刻を':'区切り
2011/10/12 17:17:12      //日時を'/:'区切り

なんか、ベタであんまりカッッコ良いやり方じゃないとは思うんですが結構使えてます。