PHP日期格式设置求助:无法生成指定格式的日期
解决PHP日期格式化为Wednesday, May 16th的问题
嘿,我来帮你搞定这个日期格式的需求!要输出类似Wednesday, May 16th这种带序数词后缀(st/nd/rd/th)的日期,PHP内置的date()函数没法直接生成序数词,不过咱们可以通过自定义逻辑轻松实现,下面给你两种靠谱的方案:
方法一:DateTime类+自定义序数词函数(推荐)
这种方法兼容性好,逻辑清晰,还能灵活调整格式:
// 生成序数词后缀的辅助函数 function getOrdinalSuffix($day) { // 11、12、13是特殊情况,统一用th if ($day >= 11 && $day <= 13) { return 'th'; } // 根据日数最后一位判断后缀 switch ($day % 10) { case 1: return 'st'; case 2: return 'nd'; case 3: return 'rd'; default: return 'th'; } } // 获取当前日期 $currentDate = new DateTime(); // 提取不带前导零的日数 $dayNumber = $currentDate->format('j'); // 获取对应的序数词后缀 $ordinal = getOrdinalSuffix($dayNumber); // 拼接成目标格式:星期全称, 月份全称 日数+后缀 $formattedDate = $currentDate->format('l, F') . " {$dayNumber}{$ordinal}"; // 输出结果 echo $formattedDate;
代码说明:
l(小写L):输出完整的星期名称(比如Wednesday)F:输出完整的月份名称(比如May)j:输出不带前导零的日数(比如16而非06)- 辅助函数专门处理序数词的特殊情况,确保所有日数都能得到正确的后缀
方法二:利用IntlDateFormatter(需开启intl扩展)
如果你的服务器开启了intl扩展,也可以用国际化日期格式化工具来实现,不过需要设置对应的本地化规则:
$formatter = new IntlDateFormatter( 'en_US', IntlDateFormatter::FULL, IntlDateFormatter::NONE, date_default_timezone_get(), IntlDateFormatter::GREGORIAN, 'EEEE, MMMM d' ); $date = new DateTime(); $baseDate = $formatter->format($date); // 同样需要添加序数词后缀,这里可以复用上面的getOrdinalSuffix函数 $dayNumber = $date->format('j'); $ordinal = getOrdinalSuffix($dayNumber); $formattedDate = str_replace($dayNumber, "{$dayNumber}{$ordinal}", $baseDate); echo $formattedDate;
这个方法适合需要多语言支持的场景,但依赖intl扩展,所以如果服务器没开启的话,还是第一种方法更稳妥。
内容的提问来源于stack exchange,提问作者user1702965
相关产品推荐
相关产品推荐

