如何强制PHP的IntlDateFormatter格式化输出时仅忽略年份部分
PHP IntlDateFormatter 输出无年份FULL级别日期方案
实现原理
通过PHP intl扩展提供的标准API直接调整格式化规则,全程基于ICU内置的本地化规则生成输出,无需事后处理日期字符串,完全适配不同地区的日期格式顺序、分隔符规则。
推荐方案(使用DateTimePatternGenerator)
直接调用ICU内置的日期模式生成器,指定需要保留的字段(星期全称、月份全称、日期),自动生成对应地区的正确格式规则:
function getFullDateWithoutYear(string $locale, string $timezone, int $timestamp): string { // 初始化对应地区的日期模式生成器 $patternGenerator = DateTimePatternGenerator::create($locale); // 指定需要保留的字段:EEEE=星期全称、MMMM=月份全称、d=日期 $customPattern = $patternGenerator->getBestPattern('EEEE MMMM d'); // 用生成的自定义规则初始化日期格式化器 $formatter = new IntlDateFormatter( $locale, IntlDateFormatter::NONE, IntlDateFormatter::NONE, $timezone, IntlDateFormatter::GREGORIAN, $customPattern ); return $formatter->format($timestamp); } // 测试用例 $targetTime = strtotime('2021-09-17 15:00'); var_dump(getFullDateWithoutYear('en-US', 'Europe/London', $targetTime)); var_dump(getFullDateWithoutYear('sv-SE', 'Europe/London', $targetTime));
输出结果
string(19) "Friday, September 17" string(20) "fredag 17 september"
注:原问题中期望输出的字符串长度为带年份时的长度,实际输出无年份内容长度会对应缩短,内容完全匹配需求。
备选方案(基于FULL模板修改)
如果需要完全保留FULL级别格式的所有细节(除了年份),可以先获取FULL级别的原始模板,剔除年份占位符后重新设置规则:
function getFullDateWithoutYearAlt(string $locale, string $timezone, int $timestamp): string { $formatter = new IntlDateFormatter( $locale, IntlDateFormatter::FULL, IntlDateFormatter::NONE, $timezone, IntlDateFormatter::GREGORIAN ); // 获取FULL级别的原始格式模板 $originalPattern = $formatter->getPattern(); // 移除所有年份相关占位符,清理多余的分隔符和空格 $patternWithoutYear = preg_replace('/[yYuUr]+/', '', $originalPattern); $patternWithoutYear = trim(preg_replace('/(,|\s){2,}/', ' ', $patternWithoutYear), ', '); $formatter->setPattern($patternWithoutYear); return $formatter->format($timestamp); }
内容的提问来源于stack exchange,提问作者user16508174
相关产品推荐
相关产品推荐

