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号