PHP strftime()函数

注意: 从 PHP 8.1.0 开始,strftime()gmstrftime() 函数已被弃用。建议使用 date() 函数或 IntlDateFormatter 类替代。

strftime() 函数根据区域设置格式化本地时间/日期。这个函数可以根据不同的地区设置,以本地化的方式显示日期和时间。

语法

strftime(string $format [, int $timestamp = time()]) : string|false

参数说明

参数 描述
format

必需。 指定如何格式化日期/时间。可以是下列字符的组合:

有关详细的格式字符,请参阅下面的格式字符表。

timestamp

可选。 指定要格式化的时间戳。默认是当前时间 time()。

格式字符

格式字符 描述 示例
%a 星期几的简写(根据本地设置) Mon, Tue, 周日, 周一
%A 星期几的完整名称(根据本地设置) Monday, Sunday, 星期一, 星期日
%b 月份的简写(根据本地设置) Jan, Feb, 一月, 二月
%B 月份的完整名称(根据本地设置) January, February, 一月, 二月
%c 默认的日期和时间格式(根据本地设置) Sun Aug 15 10:30:45 2023
%C 世纪(年份除以100,去掉小数位,00-99) 20(对于2023年)
%d 月份中的第几天,两位数(01-31) 01, 15, 31
%D 与 %m/%d/%y 相同 08/15/23
%e 月份中的第几天,一位数时前面加空格(1-31) " 1", "15", "31"
%F 与 %Y-%m-%d 相同(ISO 8601 日期格式) 2023-08-15
%g 2位数的年份,符合ISO周数(见%V) 23
%G 4位数的年份,符合ISO周数(见%V) 2023
%h 与 %b 相同 Jan, Feb, 一月, 二月
%H 24小时制的小时数(00-23) 00, 10, 23
%I 12小时制的小时数(01-12) 01, 10, 12
%j 一年中的第几天(001-366) 001, 227, 366
%m 月份数(01-12) 01, 08, 12
%M 分钟数(00-59) 00, 30, 59
%n 换行符 \n
%p 上午或下午(根据本地设置) AM, PM, 上午, 下午
%r 12小时制的时间(包括上午/下午) 10:30:45 AM
%R 24小时制的时间,不包含秒 10:30
%S 秒数(00-59) 00, 30, 59
%t 制表符 \t
%T 24小时制的时间(包含秒) 10:30:45
%u ISO-8601 星期几,1表示星期一,7表示星期日 1-7
%U 一年中的第几周,以第一个星期日作为第一周的开始 00-53
%V ISO-8601:1988 一年中的第几周,以第一个星期一作为第一周的开始 01-53
%w 星期几,0表示星期日,6表示星期六 0-6
%W 一年中的第几周,以第一个星期一作为第一周的开始 00-53
%x 默认的日期格式(根据本地设置) 08/15/23
%X 默认的时间格式(根据本地设置) 10:30:45
%y 2位数的年份 00, 23, 99
%Y 4位数的年份 2000, 2023, 2099
%z 时区偏移 +0800
%Z 时区名称或缩写 CST, UTC, EDT
%% 百分号 %

示例

示例 1:基本用法(英语环境)

<?php
// 设置区域为英语
setlocale(LC_TIME, 'en_US.UTF-8');

echo strftime("%A, %B %d, %Y") . "<br>";
echo strftime("%H:%M:%S") . "<br>";
echo strftime("%c") . "<br>";
echo strftime("Today is %A, the %d of %B in the year %Y");

// 输出类似:
// Tuesday, August 15, 2023
// 10:30:45
// Tue Aug 15 10:30:45 2023
// Today is Tuesday, the 15 of August in the year 2023
?>

示例 2:中文环境

<?php
// 设置区域为中文
setlocale(LC_TIME, 'zh_CN.UTF-8');

echo strftime("%Y年%m月%d日 %H:%M:%S") . "<br>";
echo strftime("今天是%A") . "<br>";
echo strftime("现在是%B") . "<br>";
echo strftime("%c");

// 输出类似:
// 2023年08月15日 10:30:45
// 今天是星期二
// 现在是八月
// 2023年08月15日 星期二 10时30分45秒
?>

示例 3:不同的区域设置

<?php
$timestamp = strtotime("2023-12-25 14:30:00");

// 美国英语
setlocale(LC_TIME, 'en_US.UTF-8');
echo "English (US): " . strftime("%A, %B %d, %Y at %I:%M %p", $timestamp) . "<br>";

// 英国英语
setlocale(LC_TIME, 'en_GB.UTF-8');
echo "English (UK): " . strftime("%A, %d %B %Y at %H:%M", $timestamp) . "<br>";

// 法语
setlocale(LC_TIME, 'fr_FR.UTF-8');
echo "French: " . strftime("%A %d %B %Y à %H:%M", $timestamp) . "<br>";

// 德语
setlocale(LC_TIME, 'de_DE.UTF-8');
echo "German: " . strftime("%A, der %d. %B %Y, %H:%M Uhr", $timestamp) . "<br>";

// 输出类似:
// English (US): Monday, December 25, 2023 at 02:30 PM
// English (UK): Monday, 25 December 2023 at 14:30
// French: lundi 25 décembre 2023 à 14:30
// German: Montag, der 25. Dezember 2023, 14:30 Uhr
?>

示例 4:使用特定时间戳

<?php
setlocale(LC_TIME, 'en_US.UTF-8');

$timestamp = mktime(10, 30, 0, 8, 15, 2023);
echo strftime("Timestamp %s corresponds to %c", $timestamp) . "<br>";

// ISO 8601格式
echo strftime("ISO date: %F", $timestamp) . "<br>";
echo strftime("ISO time: %T", $timestamp) . "<br>";
echo strftime("ISO week: %V", $timestamp) . "<br>";

// 输出类似:
// Timestamp 1692077400 corresponds to Tue Aug 15 10:30:00 2023
// ISO date: 2023-08-15
// ISO time: 10:30:00
// ISO week: 33
?>

示例 5:创建自定义格式

<?php
setlocale(LC_TIME, 'en_US.UTF-8');

function formatDateTime($timestamp = null) {
    if ($timestamp === null) {
        $timestamp = time();
    }

    $formats = [
        'full' => "%A, %B %d, %Y at %I:%M:%S %p",
        'short' => "%m/%d/%Y %H:%M",
        'iso' => "%Y-%m-%dT%H:%M:%S%z",
        'readable' => "%l:%M %p on %A, %B %e, %Y"
    ];

    $result = [];
    foreach ($formats as $name => $format) {
        $result[$name] = strftime($format, $timestamp);
    }

    return $result;
}

$timeFormats = formatDateTime();
echo "<pre>";
print_r($timeFormats);
echo "</pre>";

// 输出类似:
// Array
// (
//     [full] => Tuesday, August 15, 2023 at 10:30:45 AM
//     [short] => 08/15/2023 10:30
//     [iso] => 2023-08-15T10:30:45+0800
//     [readable] => 10:30 AM on Tuesday, August 15, 2023
// )
?>

示例 6:替代方案 - 使用date()函数

<?php
// 由于strftime()已被弃用,可以使用date()函数
// 但date()不支持本地化,如果需要本地化,使用IntlDateFormatter

echo "使用date()函数:<br>";
echo date("Y-m-d H:i:s") . "<br>";
echo date("l, F j, Y") . "<br>";
echo date("D, d M Y H:i:s T") . "<br><br>";

// 使用IntlDateFormatter进行本地化(需要intl扩展)
if (class_exists('IntlDateFormatter')) {
    $formatter = new IntlDateFormatter(
        'zh_CN',
        IntlDateFormatter::FULL,
        IntlDateFormatter::FULL,
        'Asia/Shanghai',
        IntlDateFormatter::GREGORIAN,
        'yyyy年MM月dd日 EEEE HH:mm:ss'
    );
    echo "使用IntlDateFormatter: " . $formatter->format(time());
} else {
    echo "Intl扩展未安装";
}

// 输出类似:
// 使用date()函数:
// 2023-08-15 10:30:45
// Tuesday, August 15, 2023
// Tue, 15 Aug 2023 10:30:45 CST
//
// 使用IntlDateFormatter: 2023年08月15日 星期二 10:30:45
?>

弃用说明和替代方案

重要通知:PHP 8.1.0 开始弃用

从 PHP 8.1.0 开始,strftime()gmstrftime() 函数已被弃用,并将在 PHP 9.0.0 中移除。

替代方案:

  1. 使用 date() 函数 - 如果不需要本地化支持
  2. 使用 IntlDateFormatter - 如果需要本地化支持(需要安装intl扩展)
  3. 使用 DateTime::format() - 面向对象的方式

转换表:strftime格式到date格式

strftime格式 date格式 描述
%Y Y 4位数的年份
%y y 2位数的年份
%m m 月份,两位数(01-12)
%d d 日,两位数(01-31)
%H H 24小时制的小时数(00-23)
%I h 12小时制的小时数(01-12)
%M i 分钟数(00-59)
%S s 秒数(00-59)
%p A 上午/下午(大写)
%e j 日,无前导零(1-31)
%F Y-m-d ISO 8601日期格式
%T H:i:s 24小时制时间格式

注意事项

  • 在使用 strftime() 之前,需要使用 setlocale() 函数设置正确的区域
  • Windows 系统上的区域字符串可能与 Unix/Linux 系统不同
  • 从 PHP 8.1.0 开始,此函数已被弃用,建议使用替代方案
  • 某些格式字符(如本地化的星期、月份名称)只能在设置了正确的区域后工作
  • 时区信息依赖于系统的时区设置

相关函数

  • date() - 格式化本地时间/日期(推荐替代)
  • gmstrftime() - 根据区域设置格式化 GMT/UTC 时间/日期(已弃用)
  • setlocale() - 设置地区信息