PHP8.1とSmarty4.1.0のdate_format修飾子

PHP8.1でSmarty4.1.0のdate_format修飾子を使用した場合にDeprecatedエラーが発生しました。

Deprecated: Function strftime() is deprecated in /home/xxxxxx/public_html/xxxxxx/library/smarty4/libs/plugins/modifier.date_format.php on line 81

原因

  1. strftime()がPHP8.1より非推奨になった。
  2. date_format修飾子の日付/時間のフォーマット指定によってはstrftime()が動作する。

結論

日付/時間のフォーマットをdate()のものに変更することにより、date_format修飾子内でstrftime()が動作することを回避します。

「2022年03月07日 20:10」という表記をする場合は以下のとおりです。

まずはstrftime()のフォーマット。この記述ではDeprecatedエラーが発生します。

{$datetime|date_format:'%Y年%m月%d日 %H:%M'}

これをdate()のフォーマットに変更します。

{$datetime|date_format:'Y年m月d日 H:i'}

※$datetimeにはUNIXタイムスタンプが格納されているとします。

これでDeprecatedエラーが発生しなくなりました。

解説

"libs/plugins/modifier.date_format.php"のソースコードを確認すると、51行目でフォーマットによる分岐があります。

if ($formatter === 'strftime' || ($formatter === 'auto' && strpos($format, '%') !== false)) {
  if (Smarty::$_IS_WINDOWS) {
    /* --- 
      ※省略 :: Windows環境向け処理
    --- */
  }
  return strftime($format, $timestamp);
} else {
  return date($format, $timestamp);
}

$formatに「%」が含まれる場合にstrftime()が動作、含まれない場合にdate()が動作するようになっているようです。$formatterは通常省略する変数なので自動的に「auto」が格納されていると考えて良いでしょう。

Smarty公式ドキュメントでは、strftime()のフォーマットを使用するように解説されているため、実は「date()のフォーマットも使える」というのはほぼ裏ワザではないかと感じました。これは実装部分を見てみないと分かりませんね。(´・ω・)

スポンサードリンク