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 |
| %% | 百分号 | % |
<?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
?>
<?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秒
?>
<?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
?>
<?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
?>
<?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
// )
?>
<?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 开始,strftime() 和 gmstrftime() 函数已被弃用,并将在 PHP 9.0.0 中移除。
替代方案:
date() 函数 - 如果不需要本地化支持IntlDateFormatter 类 - 如果需要本地化支持(需要安装intl扩展)DateTime::format() - 面向对象的方式| 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() 函数设置正确的区域