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";       // 20231005

echo "当前时间:" . strftime("%H:%M:%S %p", $now) . "\n";        // 15:30:45 下午

echo "完整格式:" . strftime("%c", $now) . "\n";                 // 20231005153045

?>

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:00UTC+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()的配合,可高效解决各类时间处理需求。实际开发中需注意区域设置对输出的影响,并根据性能需求选择合适的时间处理函数。

 

posted @ 2024-01-27 14:17  zlf2000  阅读(4921)  评论(0)    收藏  举报