如何强制 PHP 的 IntlDateFormatter 仅忽略输出中的年份?

问题描述 投票:0回答:2

示例代码:

$a = new IntlDateFormatter('en-US', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Europe/London', IntlDateFormatter::GREGORIAN);
var_dump($a->format(strtotime('2021-09-17 15:00')));

$a = new IntlDateFormatter('sv-SE', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Europe/London', IntlDateFormatter::GREGORIAN);
var_dump($a->format(strtotime('2021-09-17 15:00')));

实际产量:

string(26) "Friday, September 17, 2021"
string(24) "fredag 17 september 2021"

想要的输出:

string(26) "Friday, September 17"
string(24) "fredag 17 september"

IntlDateFormatter::FULL
更改为
IntlDateFormatter::LONG
没有帮助。它只会产生这样的输出:

string(18) "September 17, 2021"
string(17) "17 september 2021"

IntlDateFormatter::NONE
IntlDateFormatter::SHORT
IntlDateFormatter::MEDIUM
都不会产生所需的输出。

我特别想要“完整”的,但不是年份部分。

请不要提出任何试图“破解”年份的解决方案,例如字符串/正则表达式删除它。我需要解决方案使引擎在输出中不包含年份部分。我确信其他语言环境比我用作示例的两个语言环境有更复杂/不同的年份部分。

php intldateformatter
2个回答
3
投票
每个语言环境都会定义自己的日期格式,内容和顺序也会有所不同。您需要为所有人定义一个模式,允许用户从列表中选择他们想要的模式,或者做您似乎不想做的事情,并解析/修改区域设置的模式。

没有一个现有的解决方案可以简单地自动完成您想要的输出。

https://www.php.net/manual/en/intldateformatter.setpattern.php

https://www.unicode.org/reports/tr35/tr35-dates.html#Date_Field_Symbol_Table

$d = new DateTime('2021-09-17 15:00'); $fmt_en = new IntlDateFormatter('en-US', IntlDateFormatter::NONE, IntlDateFormatter::NONE); $fmt_en->setPattern('EEEE, MMMM d'); $fmt_sv = new IntlDateFormatter('sv-SV', IntlDateFormatter::NONE, IntlDateFormatter::NONE); $fmt_sv->setPattern('MMMM d, EEEE'); var_dump( $fmt_en->format($d), $fmt_sv->format($d) );
输出:

string(20) "Friday, September 17" string(20) "september 17, fredag"
    

0
投票
如果您只想关注有限数量的区域设置并保持合理的默认值,则可以执行以下操作。

$formatter = match ($lang) { 'en' => new \IntlDateFormatter($lang, pattern: 'EEEE, MMMM d'), 'sv' => new \IntlDateFormatter($lang, pattern: 'MMMM d, EEEE'), default => new \IntlDateFormatter($lang, \IntlDateFormatter::FULL, \IntlDateFormatter::NONE), }; $date = $formatter->format($datetime);
    
© www.soinside.com 2019 - 2024. All rights reserved.