strftime () 函數用法詳解
一、函數基礎概述
1. 功能定義
strftime()是 PHP 中用于本地化日期時間格式化的核心函數,基于系統區域設置(Locale)將 UNIX 時間戳或時間字符串轉換為指定格式的文本輸出。其功能類似于sprintf(),通過%引導的格式符組合實現靈活的時間展示。
2. 語法結構
|
string strftime ( string $format [, int $timestamp = time() ] ) |
- format(必需):包含格式符的字符串(區分大小寫),定義輸出格式。
- timestamp(可選):UNIX 時間戳(默認值為當前時間time())。
- 本地化輸出:結果受系統區域設置影響(如中文環境顯示 “星期一”,英文環境顯示 “Monday”)。
- 與gmstrftime()區別:strftime()返回本地時間,gmstrftime()返回格林尼治標準時間(GMT)。
3. 核心特性
二、核心格式符分類與示例
1. 基礎日期格式符
|
格式符 |
描述 |
示例(2023-10-05) |
|
%Y |
四位數年份(帶世紀) |
2023 |
|
%y |
兩位數年份(00-99) |
23 |
|
%m |
兩位數月份(01-12) |
10 |
|
%b |
月份縮寫(英文:Jan-Dec) |
Oct |
|
%B |
月份全稱(英文:October) |
October |
|
%d |
兩位數日期(01-31) |
05 |
|
%F |
完整日期(%Y-%m-%d簡寫) |
2023-10-05 |
2. 時間格式符
|
格式符 |
描述 |
示例(15:30:45) |
|
%H |
24 小時制小時(00-23) |
15 |
|
%I |
12 小時制小時(01-12) |
03 |
|
%M |
分鐘(00-59) |
30 |
|
%S |
秒(00-59) |
45 |
|
%p |
上 / 下午標識(AM/PM) |
PM |
|
%T |
完整時間(%H:%M:%S簡寫) |
15:30:45 |
3. 星期與周格式符
|
格式符 |
描述 |
示例(2023-10-05 星期四) |
|
%a |
星期縮寫(英文:Thu) |
Thu |
|
%A |
星期全稱(英文:Thursday) |
Thursday |
|
%w |
數字星期(0 = 周日,1-6 = 周一至周六) |
4(周四) |
|
%U |
一年中的第 N 周(周日為第一天) |
40(假設第 40 周) |
|
%W |
一年中的第 N 周(周一為第一天) |
40 |
4. 特殊格式符
|
格式符 |
描述 |
示例(2023-10-05 15:30:45) |
|
%c |
本地化標準日期時間串 |
Oct 05 23 15:30:45(英文) |
|
%x |
本地化標準日期串 |
10/05/23 |
|
%X |
本地化標準時間串 |
15:30:45 |
|
%% |
輸出百分號% |
% |
三、典型應用場景與代碼示例
1. 基礎格式化:日期時間展示
|
<?php // 設置中文環境(顯示中文星期/月份) setlocale(LC_TIME, 'zh_CN.UTF-8'); $now = time(); echo "當前日期:" . strftime("%Y年%m月%d日", $now) . "\n"; // 2023年10月05日 echo "當前時間:" . strftime("%H:%M:%S %p", $now) . "\n"; // 15:30:45 下午 echo "完整格式:" . strftime("%c", $now) . "\n"; // 2023年10月05日 15時30分45秒 ?> |
2. SQL 應用:數據分組統計(以 SQLite 為例)
|
-- 格式化當前時間 SELECT strftime('%Y-%m-%d %H:%M:%S', 'now', 'localtime'); -- 結果:2023-10-05 15:30:45 -- 按月統計消費金額 SELECT strftime('%Y-%m', 消費時間) AS 月份, SUM(消費金額) AS 月消費總額 FROM 流水表 GROUP BY 月份; |
3. 時間偏移計算:結合 strtotime ()
|
<?php $targetDate = strtotime("2023-10-05"); // 計算3天后的日期 $futureDate = strtotime("+3 days", $targetDate); echo strftime("%Y-%m-%d", $futureDate) . "\n"; // 2023-10-08 // 計算上個月最后一天 $lastDayOfLastMonth = strtotime("last day of last month", $targetDate); echo strftime("%Y-%m-%d", $lastDayOfLastMonth) . "\n"; // 2023-09-30 ?> |
4. 本地化星期判斷:switch 案例
|
<?php setlocale(LC_TIME, 'zh_CN.UTF-8'); // 設置中文環境 $weekday = strftime("%A"); // 獲取星期全稱(如“星期四”) switch ($weekday) { case "星期一": echo "今日是$weekday,開啟工作模式!"; break; case "星期六": case "星期日": echo "今日是$weekday,享受休閑時光!"; break; default: echo "今日是$weekday,正常工作中..."; } ?> |
5. 新增示例:時間格式化對比(中文 vs 英文)
|
<?php // 中文環境 setlocale(LC_TIME, 'zh_CN.UTF-8'); echo "中文格式:" . strftime("%A,%B %d日", time()) . "\n"; // 輸出:星期四,十月05日 // 英文環境 setlocale(LC_TIME, 'en_US.UTF-8'); echo "英文格式:" . strftime("%A, %B %dth", time()) . "\n"; // 輸出:Thursday, October 5th ?> |
6. 新增示例:時區轉換(本地時間轉 GMT)
|
<?php $beijingTime = mktime(9, 0, 0, 10, 5, 2023); // 北京時間2023-10-05 09:00:00 // 轉換為GMT時間(UTC+0) $gmtTime = $beijingTime - 8 * 3600; // 減去8小時時區差 echo "北京時間:" . strftime("%Y-%m-%d %H:%M:%S", $beijingTime) . "\n"; // 2023-10-05 09:00:00 echo "GMT時間:" . gmstrftime("%Y-%m-%d %H:%M:%S", $gmtTime) . "\n"; // 2023-10-04 23:00:00 ?> |
四、關鍵注意事項
1. 區域設置(Locale)影響
- 通過setlocale(LC_TIME, '區域標識')控制輸出語言:
? 中文:setlocale(LC_TIME, 'zh_CN.UTF-8')
? 英文:setlocale(LC_TIME, 'en_US.UTF-8')
- 若未設置,默認使用系統環境的區域設置。
- 部分格式符(如%c、%x、%X)的輸出結果因操作系統和區域設置而異,需在目標環境中測試。
- 避免在高頻循環中重復調用strftime(),可預先計算時間戳并緩存。
- 對于簡單格式(如Y-m-d),可使用更輕量的date()函數替代。
2. 格式符兼容性
3. 性能優化
4. 與 gmstrftime () 的區別
|
<?php $timestamp = mktime(0, 0, 0, 1, 1, 2023); // 北京時間2023-01-01 00:00:00 echo "本地時間:" . strftime("%Y-%m-%d %H:%M:%S", $timestamp) . "\n"; // 2023-01-01 00:00:00 echo "GMT時間:" . gmstrftime("%Y-%m-%d %H:%M:%S", $timestamp) . "\n"; // 2022-12-31 16:00:00(UTC+8時區差異) ?> |
五、擴展應用:時間戳與格式化組合
1. 獲取指定日期的 UNIX 時間戳
|
<?php $dateStr = "2024-01-01"; $timestamp = strtotime($dateStr); // 轉換為時間戳 echo strftime("%Y-%m-%d %H:%M:%S", $timestamp) . "\n"; // 2024-01-01 00:00:00 ?> |
2. 相對時間計算(以 “下周五” 為例)
|
<?php $nextFriday = strtotime("next Friday"); echo strftime("下一個周五是:%Y-%m-%d", $nextFriday) . "\n"; ?> |
六、總結
strftime()函數通過靈活的格式符組合,提供了強大的本地化日期時間格式化能力,適用于以下場景:
- 生成符合業務需求的時間標簽(如日志、報表)。
- 基于時間維度的數據分析與分組。
- 多語言環境下的時間展示適配。
掌握其核心格式符用法及與setlocale()、strtotime()的配合,可高效解決各類時間處理需求。實際開發中需注意區域設置對輸出的影響,并根據性能需求選擇合適的時間處理函數。

浙公網安備 33010602011771號