PHP timezone_abbreviations_list()函数

timezone_abbreviations_list() 函数返回一个包含夏令时、偏移量和时区名称的关联数组。这个函数通常用于获取系统中所有可用的时区缩写信息。

这个函数返回的数据量很大,通常用于调试、分析或创建时区相关的工具。

语法

timezone_abbreviations_list() : array

参数说明

参数 描述
无参数

timezone_abbreviations_list() 函数不接受任何参数。

返回值

返回一个多维关联数组,其中键是时区缩写(如 "EST"、"PST"),值是包含以下键的数组:

键名 描述 示例
dst 是否启用夏令时(Daylight Saving Time) true 或 false
offset 与 UTC 的偏移量(秒) -18000, 28800, 0
timezone_id 时区标识符(完整的 Olson 时区名称) America/New_York, Asia/Shanghai

示例

示例 1:基本用法

<?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 小时)
//     夏令时: 否
?>

示例 2:查找特定时区缩写

<?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
//         )
//     ... 更多时区
// )
?>

示例 3:根据偏移量查找时区

<?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
// )
?>

示例 4:创建时区缩写查找工具

<?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
?>

示例 5:统计时区信息

<?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 次
?>

示例 6:与时区相关函数配合使用

<?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 "&nbsp;&nbsp;- " . $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() 返回的数据量很大,可能包含数千个条目
  • 相同的时区缩写可能对应多个不同的时区(如 "CST" 可以表示中国标准时间或美国中部标准时间)
  • 偏移量以秒为单位,正值表示东时区,负值表示西时区
  • 时区信息基于系统的时区数据库,不同系统可能有所不同
  • 这个函数主要用于调试和分析,生产环境中通常使用 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

相关函数