PHP 8.0 中 timezone_identifiers_list() 返回约400+时区,可用 array_filter() 配合 str_starts_with() 按前缀(如 'Asia/')过滤,排除 'Etc/'、'SystemV/' 等兼容时区,并支持关键词模糊匹配或硬编码常用列表,最后建议用 array_values() 重置键名。

PHP 8.0 中 timezone_identifiers_list() 返回全部时区标识符(约 400+ 个),如需过滤,核心方法是结合 PHP 内置的数组函数进行条件筛选,无需手动维护时区列表。
按地区前缀过滤(如 Asia、Europe、America)
最常用方式是用 array_filter() 配合 str_starts_with()(PHP 8.0+ 原生支持):
$asiaTimezones = array_filter(
timezone_identifiers_list(),
fn($tz) => str_starts_with($tz, 'Asia/')
);常见地区前缀包括:'Asia/'、'Europe/'、'America/'、'Australia/'、'Pacific/' 等。注意大小写敏感,且必须带斜杠('Asia' 不匹配 'Asia/Shanghai',而 'Asia/' 才匹配)。
排除特定类型时区(如 Etc/* 和 SystemV/*)
这些属于系统兼容时区或反向偏移表示(如 Etc/GMT+8 实际对应 UTC−8),一般应用中应排除:
立即学习“PHP免费学习笔记(深入)”;
- 使用
!str_starts_with($tz, 'Etc/') - 加上
!str_starts_with($tz, 'SystemV/') - 可一并排除
'Factory'和'US/'(已废弃)
示例:
$filtered = array_filter(
timezone_identifiers_list(),
fn($tz) => !str_starts_with($tz, 'Etc/') &&
!str_starts_with($tz, 'SystemV/') &&
$tz !== 'Factory' &&
!str_starts_with($tz, 'US/')
);按城市/国家关键词搜索(模糊匹配)
适合前端下拉搜索或后台按用户输入筛选:
- 用
stripos($tz, 'shanghai')判断是否包含中文拼音或英文名 - 注意
timezone_identifiers_list()中城市名均为英文,如'Asia/Shanghai'、'Europe/London'、'America/New_York' - 空格和下划线需统一处理,建议用
str_replace('_', ' ', $tz)辅助匹配
例如获取含 “York” 或 “Tokyo” 的时区:
$keywords = ['York', 'Tokyo', 'Paris'];
$matched = array_filter(
timezone_identifiers_list(),
fn($tz) => array_reduce($keywords, fn($carry, $kw) => $carry || stripos($tz, $kw) !== false, false)
);只保留常用时区(精简实用列表)
若不需要全部时区,可硬编码常用时区数组(更可控、性能更好):
$commonZones = [
'Asia/Shanghai',
'Asia/Tokyo',
'Asia/Seoul',
'Asia/Singapore',
'Europe/London',
'Europe/Paris',
'Europe/Berlin',
'America/New_York',
'America/Chicago',
'America/Denver',
'America/Los_Angeles',
'Australia/Sydney',
'Pacific/Auckland',
];该方式避免运行时过滤开销,也规避了冷门时区带来的显示/兼容问题,推荐在管理后台或用户设置页使用。
不复杂但容易忽略的是:所有过滤结果建议用 array_values() 重置键名,方便后续遍历或 JSON 输出。



















