timezone_abbreviations_list() 函数返回一个包含夏令时、偏移量和时区名称的关联数组。这个函数通常用于获取系统中所有可用的时区缩写信息。
这个函数返回的数据量很大,通常用于调试、分析或创建时区相关的工具。
timezone_abbreviations_list() : array
| 参数 | 描述 |
|---|---|
| 无参数 |
|
返回一个多维关联数组,其中键是时区缩写(如 "EST"、"PST"),值是包含以下键的数组:
| 键名 | 描述 | 示例 |
|---|---|---|
| dst | 是否启用夏令时(Daylight Saving Time) | true 或 false |
| offset | 与 UTC 的偏移量(秒) | -18000, 28800, 0 |
| timezone_id | 时区标识符(完整的 Olson 时区名称) | America/New_York, Asia/Shanghai |
<?php
// 获取时区缩写列表
$abbreviations = timezone_abbreviations_list();
// 查看部分结果
echo "<pre>";
// 只显示前几个时区缩写
$count = 0;
foreach ($abbreviations as $abbr => $timezones) {
if ($count++ > 3) break; // 只显示前4个
echo "缩写: " . $abbr . "\n";
foreach ($timezones as $info) {
echo " - 时区ID: " . $info['timezone_id'] . "\n";
echo " 偏移量: " . $info['offset'] . " 秒 (" . ($info['offset']/3600) . " 小时)\n";
echo " 夏令时: " . ($info['dst'] ? '是' : '否') . "\n";
}
echo "\n";
}
echo "</pre>";
// 输出类似:
// 缩写: acdt
// - 时区ID: Australia/Adelaide
// 偏移量: 37800 秒 (10.5 小时)
// 夏令时: 是
//
// 缩写: acst
// - 时区ID: Australia/Darwin
// 偏移量: 34200 秒 (9.5 小时)
// 夏令时: 否
//
// 缩写: adt
// - 时区ID: America/Halifax
// 偏移量: -10800 秒 (-3 小时)
// 夏令时: 是
//
// 缩写: aest
// - 时区ID: Australia/Sydney
// 偏移量: 36000 秒 (10 小时)
// 夏令时: 否
?>
<?php
// 查找特定时区缩写
function getTimezoneInfoByAbbreviation($abbreviation) {
$abbreviations = timezone_abbreviations_list();
$abbreviation = strtolower($abbreviation);
if (isset($abbreviations[$abbreviation])) {
return $abbreviations[$abbreviation];
}
return false;
}
// 查找 EST 时区信息
$est_info = getTimezoneInfoByAbbreviation('EST');
if ($est_info) {
echo "EST 时区信息:<pre>";
print_r($est_info);
echo "</pre>";
echo "<h4>EST 对应的时区:</h4>";
foreach ($est_info as $info) {
echo "时区ID: " . $info['timezone_id'] . "<br>";
echo "偏移量: " . $info['offset'] . " 秒 (" . ($info['offset']/3600) . " 小时)<br>";
echo "夏令时: " . ($info['dst'] ? '是' : '否') . "<br><br>";
}
} else {
echo "未找到 EST 时区信息";
}
// 输出类似:
// EST 时区信息:
// Array
// (
// [0] => Array
// (
// [dst] =>
// [offset] => -18000
// [timezone_id] => America/New_York
// )
// [1] => Array
// (
// [dst] =>
// [offset] => -18000
// [timezone_id] => America/Detroit
// )
// ... 更多时区
// )
?>
<?php
// 根据偏移量查找时区
function getTimezonesByOffset($offset_hours) {
$abbreviations = timezone_abbreviations_list();
$offset_seconds = $offset_hours * 3600;
$result = [];
foreach ($abbreviations as $timezones) {
foreach ($timezones as $info) {
if ($info['offset'] == $offset_seconds) {
$timezone_id = $info['timezone_id'];
if (!in_array($timezone_id, $result)) {
$result[] = $timezone_id;
}
}
}
}
return $result;
}
// 查找 UTC+8 的时区
$utc_plus_8 = getTimezonesByOffset(8);
echo "UTC+8 的时区:<pre>";
print_r($utc_plus_8);
echo "</pre>";
// 输出类似:
// UTC+8 的时区:
// Array
// (
// [0] => Asia/Shanghai
// [1] => Asia/Chongqing
// [2] => Asia/Harbin
// [3] => Asia/Urumqi
// [4] => Australia/Perth
// [5] => Asia/Singapore
// [6] => Asia/Manila
// [7] => Asia/Macau
// [8] => Asia/Taipei
// [9] => Asia/Kuala_Lumpur
// )
?>
<?php
// 创建时区缩写和完整名称的映射
function createTimezoneAbbreviationMap() {
$abbreviations = timezone_abbreviations_list();
$timezone_map = [];
foreach ($abbreviations as $abbr => $timezones) {
foreach ($timezones as $info) {
$timezone_id = $info['timezone_id'];
if (!isset($timezone_map[$timezone_id])) {
$timezone_map[$timezone_id] = [];
}
$key = $abbr . '_' . ($info['dst'] ? 'dst' : 'std');
if (!in_array($key, $timezone_map[$timezone_id])) {
$timezone_map[$timezone_id][] = $key;
}
}
}
return $timezone_map;
}
// 获取映射
$timezone_map = createTimezoneAbbreviationMap();
// 显示部分结果
echo "<h4>时区缩写映射(部分):</h4>";
echo "<pre>";
$count = 0;
foreach ($timezone_map as $timezone_id => $abbrs) {
if ($count++ > 5) break; // 只显示前6个
echo $timezone_id . ":\n";
foreach ($abbrs as $abbr) {
echo " - " . $abbr . "\n";
}
echo "\n";
}
echo "</pre>";
// 输出类似:
// 时区缩写映射(部分):
// America/New_York:
// - est_std
// - edt_dst
//
// America/Chicago:
// - cst_std
// - cdt_dst
//
// America/Denver:
// - mst_std
// - mdt_dst
//
// America/Los_Angeles:
// - pst_std
// - pdt_dst
//
// Europe/London:
// - gmt_std
// - bst_dst
//
// Asia/Shanghai:
// - cst_std
?>
<?php
// 统计时区信息
function analyzeTimezones() {
$abbreviations = timezone_abbreviations_list();
$stats = [
'total_abbreviations' => 0,
'total_entries' => 0,
'unique_timezones' => [],
'offsets' => [],
'dst_count' => 0,
'non_dst_count' => 0
];
foreach ($abbreviations as $abbr => $timezones) {
$stats['total_abbreviations']++;
$stats['total_entries'] += count($timezones);
foreach ($timezones as $info) {
// 统计唯一时区
$timezone_id = $info['timezone_id'];
if (!in_array($timezone_id, $stats['unique_timezones'])) {
$stats['unique_timezones'][] = $timezone_id;
}
// 统计偏移量
$offset = $info['offset'];
if (!isset($stats['offsets'][$offset])) {
$stats['offsets'][$offset] = 0;
}
$stats['offsets'][$offset]++;
// 统计夏令时
if ($info['dst']) {
$stats['dst_count']++;
} else {
$stats['non_dst_count']++;
}
}
}
$stats['unique_timezone_count'] = count($stats['unique_timezones']);
sort($stats['unique_timezones']);
return $stats;
}
// 分析时区
$stats = analyzeTimezones();
echo "<h4>时区信息统计:</h4>";
echo "总缩写数: " . $stats['total_abbreviations'] . "<br>";
echo "总条目数: " . $stats['total_entries'] . "<br>";
echo "唯一时区数: " . $stats['unique_timezone_count'] . "<br>";
echo "启用夏令时的条目: " . $stats['dst_count'] . "<br>";
echo "未启用夏令时的条目: " . $stats['non_dst_count'] . "<br><br>";
echo "<h4>偏移量统计(前10个):</h4>";
echo "<pre>";
arsort($stats['offsets']);
$count = 0;
foreach ($stats['offsets'] as $offset => $count) {
if ($count++ >= 10) break;
$hours = $offset / 3600;
echo sprintf("偏移量: %+d 秒 (%+6.1f 小时) - 出现 %d 次\n",
$offset, $hours, $count);
}
echo "</pre>";
// 输出类似:
// 时区信息统计:
// 总缩写数: 411
// 总条目数: 1069
// 唯一时区数: 402
// 启用夏令时的条目: 356
// 未启用夏令时的条目: 713
//
// 偏移量统计(前10个):
// 偏移量: 0 秒 ( 0.0 小时) - 出现 18 次
// 偏移量: -18000 秒 ( -5.0 小时) - 出现 13 次
// 偏移量: 36000 秒 ( 10.0 小时) - 出现 12 次
// 偏移量: 28800 秒 ( 8.0 小时) - 出现 12 次
// 偏移量: -14400 秒 ( -4.0 小时) - 出现 12 次
// 偏移量: -21600 秒 ( -6.0 小时) - 出现 11 次
// 偏移量: 39600 秒 ( 11.0 小时) - 出现 10 次
// 偏移量: 7200 秒 ( 2.0 小时) - 出现 9 次
// 偏移量: 14400 秒 ( 4.0 小时) - 出现 9 次
// 偏移量: 18000 秒 ( 5.0 小时) - 出现 9 次
?>
<?php
// 与其他时区函数配合使用
$abbreviations = timezone_abbreviations_list();
echo "<h4>时区函数比较:</h4>";
// 获取所有时区标识符
$all_timezones = DateTimeZone::listIdentifiers();
echo "DateTimeZone::listIdentifiers() 返回的时区数: " . count($all_timezones) . "<br>";
// 从缩写列表中获取唯一时区
$unique_from_abbr = [];
foreach ($abbreviations as $timezones) {
foreach ($timezones as $info) {
$timezone_id = $info['timezone_id'];
if (!in_array($timezone_id, $unique_from_abbr)) {
$unique_from_abbr[] = $timezone_id;
}
}
}
echo "timezone_abbreviations_list() 中的唯一时区数: " . count($unique_from_abbr) . "<br><br>";
// 比较两者差异
$only_in_all = array_diff($all_timezones, $unique_from_abbr);
$only_in_abbr = array_diff($unique_from_abbr, $all_timezones);
echo "只在 listIdentifiers() 中的时区数: " . count($only_in_all) . "<br>";
echo "只在 abbreviations_list() 中的时区数: " . count($only_in_abbr) . "<br><br>";
// 显示一些常见的时区缩写
$common_abbreviations = ['EST', 'PST', 'GMT', 'CST', 'JST', 'AEST'];
echo "<h4>常见时区缩写:</h4>";
foreach ($common_abbreviations as $abbr) {
$lower_abbr = strtolower($abbr);
if (isset($abbreviations[$lower_abbr])) {
echo "<strong>" . $abbr . "</strong>:<br>";
foreach ($abbreviations[$lower_abbr] as $info) {
echo " - " . $info['timezone_id'];
echo " (UTC" . sprintf("%+d", $info['offset']/3600) . ")";
echo $info['dst'] ? " [夏令时]" : "<br>";
}
echo "<br>";
}
}
// 输出类似:
// 时区函数比较:
// DateTimeZone::listIdentifiers() 返回的时区数: 440
// timezone_abbreviations_list() 中的唯一时区数: 402
//
// 只在 listIdentifiers() 中的时区数: 38
// 只在 abbreviations_list() 中的时区数: 0
//
// 常见时区缩写:
// EST:
// - America/New_York (UTC-5)
// - America/Detroit (UTC-5)
// - America/Indiana/Indianapolis (UTC-5)
// ... 更多
//
// PST:
// - America/Los_Angeles (UTC-8)
// - America/Vancouver (UTC-8)
// - America/Tijuana (UTC-8)
// ... 更多
?>
timezone_abbreviations_list() 返回的数据量很大,可能包含数千个条目DateTimeZone 类| 缩写 | 完整名称 | 时区 | 偏移量 (UTC) |
|---|---|---|---|
| EST | Eastern Standard Time | America/New_York | UTC-5 |
| EDT | Eastern Daylight Time | America/New_York | UTC-4 |
| CST | Central Standard Time | America/Chicago | UTC-6 |
| CDT | Central Daylight Time | America/Chicago | UTC-5 |
| PST | Pacific Standard Time | America/Los_Angeles | UTC-8 |
| PDT | Pacific Daylight Time | America/Los_Angeles | UTC-7 |
| GMT | Greenwich Mean Time | Europe/London | UTC+0 |
| BST | British Summer Time | Europe/London | UTC+1 |
| CST | China Standard Time | Asia/Shanghai | UTC+8 |
| JST | Japan Standard Time | Asia/Tokyo | UTC+9 |
| AEST | Australian Eastern Standard Time | Australia/Sydney | UTC+10 |
| AEDT | Australian Eastern Daylight Time | Australia/Sydney | UTC+11 |