You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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完整数据:

  1. 在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
  1. 重新构建Docker镜像并运行测试脚本,此时IntlDateFormatter应该能正确输出乌克兰语的月份名称(比如5月对应травень)。

内容的提问来源于stack exchange,提问作者UKRman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:32:41