核心差異:PHP vs Smarty
| 操作 | PHP 原生 | Smarty 模板 |
| 取得當前時間戳 | time() | {$smarty.now} |
| 格式化輸出 | date('Y-m-d H:i:s') | {$timestamp|date_format:'%Y-%m-%d %H:%M:%S'} |
Smarty 內建時間變數
{* 輸出 Unix 時間戳 *}
{$smarty.now}
{* 結果範例:1702236776 *}
date_format 修飾符完整用法
語法:{$timestamp|date_format:'格式字串'},格式字串相容 strftime() 標準。
常用格式字元對照
| 字元 | 含義 | 範例 |
%Y | 四位數年份 | 2024 |
%m | 兩位數月份 (01-12) | 12 |
%d | 兩位數日期 (01-31) | 25 |
%H | 24 小時制 (00-23) | 14 |
%M | 分鐘 (00-59) | 30 |
%S | 秒數 (00-59) | 45 |
%A | 完整星期名稱 | Wednesday |
%B | 完整月份名稱 | December |
%e | 日期 (1-31,不補零) | 25 |
實戰範例
{* 當前時間完整格式 *}
{$smarty.now|date_format:'%Y-%m-%d %H:%M:%S'}
{* 輸出:2024-12-25 14:30:45 *}
{* 僅顯示時間 *}
{$smarty.now|date_format:'%H:%M:%S'}
{* 長日期格式 *}
{$smarty.now|date_format:'%A, %B %e, %Y'}
{* 輸出:Wednesday, December 25, 2024 *}
{* 格式化傳入變數 *}
{$goods.add_time|date_format:'%Y-%m-%d %H:%M:%S'}
{* 變數預設為當前時間 *}
{$yesterday|date_format:'%Y-%m-%d'}
PHP 控制器傳遞時間變數
$smarty = new Smarty();
$smarty->assign('currtime', time()); // 當前時間戳
$smarty->assign('yesterday', strtotime('-1 day')); // 昨天時間戳
$smarty->display('index.tpl');
模板中完整示範
{* index.tpl *}
<ul>
<li>當前時間(預設格式):{$smarty.now|date_format}</li>
<li>當前時間(時分秒):{$smarty.now|date_format:'%H:%M:%S'}</li>
<li>傳入時間(預設):{$currtime|date_format}</li>
<li>傳入時間(長格式):{$currtime|date_format:'%A, %B %e, %Y'}</li>
<li>傳入時間(標準):{$currtime|date_format:'%Y-%m-%d %H:%M:%S'}</li>
</ul>
輸出結果範例
當前時間(預設格式):Dec 25, 2024
當前時間(時分秒):14:30:45
傳入時間(預設格式):Dec 25, 2024
傳入時間(長格式):Wednesday, December 25, 2024
傳入時間(標準):2024-12-25 14:30:45
進階技巧與注意事項
- 時區設定:Smarty 使用伺服器時區,需在 PHP 端
date_default_timezone_set('Asia/Taipei') 統一
- 快取考量:
{$smarty.now} 在模板快取時會被「凍結」,若需即時時間請用 {$smarty.now|date_format} 禁用該區塊快取或改用 JavaScript 客戶端渲染
- 格式字串引號:單引號包裹格式字串,內含單引號需跳脫或用雙引號
{$t|date_format:"%Y-%m-%d"}
- 無管道符空格:
| 前後不可有空格,否則視為字串串接
- 預設格式:不指定格式時等同
%b %e, %Y (如 Dec 25, 2024)
常見錯誤排查
| 錯誤現象 | 原因 | 解決 |
| 輸出時間戳而非格式化日期 | 忘記加 |date_format | 補上修飾符 |
| 日期錯誤數小時 | 伺服器時區與目標時區不符 | PHP 端 date_default_timezone_set() |
| 快取頁面時間不更新 | 模板快取鎖定 $smarty.now | 區塊 {nocache}{$smarty.now|date_format}{/nocache} 或 JS 處理 |