RHEL 8.7服务器ICU时区数据更新求助(墨西哥取消夏令时)
解决方案:更新RHEL 8.7上的ICU时区数据适配墨西哥取消夏令时
针对你的场景(PHP intldateformatter依赖ICU 60.3,需更新墨西哥时区数据),以下是可行的解决步骤:
1. 优先使用RHEL官方更新渠道
RHEL 8通过DNF提供软件包更新,先检查是否有官方推送的ICU时区补丁:
- 检查可用的ICU相关更新:
dnf check-update libicu libicu-devel - 若有可用更新,直接安装:
dnf update libicu libicu-devel - 重启PHP运行服务(根据你的环境选择):
systemctl restart php-fpm # 或 Apache(若PHP以模块运行) systemctl restart httpd - 验证更新效果:
# 查看ICU时区信息 icuinfo # 通过PHP验证墨西哥时区处理 php -r '$fmt = new IntlDateFormatter("es_MX", IntlDateFormatter::FULL, IntlDateFormatter::FULL); echo $fmt->getTimeZone()->getDisplayName(false, IntlDateFormatter::LONG) . "\n"; echo $fmt->format(time());'
2. 单独更新ICU时区数据文件(无需编译ICU)
如果官方无更新包,可直接替换ICU的时区数据文件:
- 获取对应ICU 60.x版本的最新tzdata适配文件(
icutz.dat),可从Unicode ICU项目的tzdata同步资源中提取 - 备份原有文件:
cp /usr/lib64/icu/60.3/tzdata/icutz.dat /usr/lib64/icu/60.3/tzdata/icutz.dat.bak - 替换为新的
icutz.dat:cp /path/to/downloaded/icutz.dat /usr/lib64/icu/60.3/tzdata/ - 重启PHP服务后验证时区是否正确
3. 编译更新ICU并重建PHP intl扩展(终极方案)
若必须升级ICU版本以适配时区变更,可手动编译:
- 安装编译依赖:
dnf install gcc gcc-c++ make autoconf libtool pkg-config php-devel - 下载ICU 60.x系列的最新稳定版本(如60.4,兼容60.3的API),解压后进入源码目录:
tar xzf icu4c-60_4-src.tgz cd icu/source - 配置并编译安装:
./configure --prefix=/usr --libdir=/usr/lib64 --enable-shared --disable-static make -j$(nproc) make install - 重新编译PHP的intl扩展:
pecl uninstall intl pecl install intl - 确保
php.ini中启用intl扩展(添加或确认extension=intl.so),重启PHP服务 - 验证ICU版本和时区处理:
php -i | grep "ICU version" php -r '$fmt = new IntlDateFormatter("es_MX", IntlDateFormatter::FULL, IntlDateFormatter::FULL); echo $fmt->format(time());'
临时 workaround:代码层手动适配
若以上方法无法快速落地,可在PHP代码中针对墨西哥时区临时处理:
// 手动设置墨西哥时区(跳过夏令时规则) $timezone = new DateTimeZone("America/Mexico_City"); $dt = new DateTime("now", $timezone); // 或自定义偏移量逻辑(仅临时使用)
内容的提问来源于stack exchange,提问作者Jose G. Garcia
相关产品推荐
相关产品推荐

