Docker容器中PHP IntlDateFormatter显示月份为M05的原因排查
问题
希望根据地区locale显示日期的本地化月份名称,但使用IntlDateFormatter类时返回的是M05这类标识加数字的格式,而非乌克兰语的月份名称。已安装icu-dev库,且知晓PHP的Intl扩展依赖ICU而非系统locale,但问题仍然存在。
Dockerfile配置
FROM php:7.4-cli-alpine RUN apk update && apk add icu-dev bash autoconf g++ make zlib-dev libzip-dev libpng-dev libwebp-dev freetype-dev libjpeg-turbo-dev libpng-dev supervisor \ && docker-php-ext-configure \ gd --enable-gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-install intl pdo_mysql gd zip RUN mv $PHP_INI_DIR/php.ini-development $PHP_INI_DIR/php.ini COPY ./common/php/conf.d /usr/local/etc/php/conf.d COPY ./development/php-cli/conf.d /usr/local/etc/php/conf.d RUN apk add unzip # fix work iconv library with alphine RUN apk add --no-cache --repository http://dl-cdn.alpinelinux.org/alpine/edge/community/ --allow-untrusted gnu-libiconv ENV LD_PRELOAD /usr/lib/preloadable_libiconv.so php COPY ./common/wait-for-it.sh /usr/local/bin/wait-for-it RUN chmod 555 /usr/local/bin/wait-for-it RUN addgroup -g 1000 app && adduser -u 1000 -G app -s /bin/sh -D app ENV COMPOSER_ALLOW_SUPERUSER 1 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet \ && rm -rf /root/.composer/cache WORKDIR /app CMD ["supervisord", "-c", "/etc/supervisor/conf.d/supervisor.conf"] USER app
测试脚本(uk_UA为有效ICU locale)
$formatter = new \IntlDateFormatter( 'uk_UA', IntlDateFormatter::FULL, IntlDateFormatter::FULL ); $formatter->setPattern('MMMM'); echo $formatter->format(new \DateTime()); // 输出M05
原因及解决办法
核心原因
Alpine Linux默认提供的icu-dev仅包含ICU开发所需的头文件和库文件,不包含完整的本地化语言数据。ICU的本地化月份名称等数据存储在独立的icu-data包中,而Alpine默认的icu-data是精简版本,只包含少量通用locale的数据,像uk_UA这类地区的本地化数据并未被包含。当ICU找不到对应locale的完整数据时,就会返回M05这类占位符格式。
解决步骤
修改Dockerfile中的apk安装命令,添加icu-data-full包,该包包含了所有ICU支持的locale完整数据:
- 在
apk add的列表中加入icu-data-full,修改后的RUN命令如下:
RUN apk update && apk add icu-dev icu-data-full bash autoconf g++ make zlib-dev libzip-dev libpng-dev libwebp-dev freetype-dev libjpeg-turbo-dev libpng-dev supervisor \ && docker-php-ext-configure \ gd --enable-gd --with-freetype --with-jpeg --with-webp \ && docker-php-ext-install intl pdo_mysql gd zip
- 重新构建Docker镜像并运行测试脚本,此时
IntlDateFormatter应该能正确输出乌克兰语的月份名称(比如5月对应травень)。
内容的提问来源于stack exchange,提问作者UKRman
相关产品推荐
相关产品推荐

