从当前月份生成未来十二个月到本地语言 php 8.0+ 的最简单方法是什么?

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

自 php8.0+ 起,

str_replace()
等多个函数不再接受“null”参数。 我从 php 7.4 升级。 就我而言,我使用 WordPress,函数 str_replace 主要用于将日期转换为法语。 我决定停止使用 str_replace 来翻译日期。

在 php7.4 中,为了显示接下来十二个月中每个月对应的帖子,我使用了以下代码

setlocale(LC_TIME, 'fr_FR');
date_default_timezone_set('Europe/Paris');
for ($x = $currentMonth; $x < $currentMonth + 12; $x++) {
    $months[] = date('Y-F-m', mktime(0, 0, 0, $x, 1));
}
$FrenchMonth = array('Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre');
$EnglishMonth = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December');

之后我将每个月(“F”日期格式)转换为我的当地语言

$twelvemonthsdata = explode('-',$months[$i]);
$twelvemonthsM = $twelvemonthsdata[1];
$twelveFormatMonth = 'F';
$twelvemonthinfrench = str_replace( $EnglishMonth,$FrenchMonnth, date($twelveFormatMonth, strtotime($twelvemonthsM)));

今天,在 php8.0+ 中,我调整了我的代码,但除了使用

strtotime()
转换“for”循环的结果并使用
DateTime()
intldateformatter()
使用它之外,我找不到任何其他方法。

$currentMonth = 日期('m');

for ($x = $currentMonth; $x < $currentMonth + 12; $x++) {
    $eachmonth = strtotime(Date('Y-F-m', mktime(0, 0, 0, $x, 1)));

    $tweelvemonths = new DateTime();
    $tweelvemonths->setTimestamp($eachmonth);

    $tweelvemonths_formatter = new IntlDateFormatter('fr_FR');
    $tweelvemonths_formatter->setTimeZone('Europe/Paris');
    $tweelvemonths_formatter->setPattern('y-MMMM-MM');
    
    $tweelvemonths_formated = $tweelvemonths_formatter->format($tweelvemonths);
    var_dump($tweelvemonths_formated);
}

是否有更简单或更短的方法可以使用或不使用 strtotime 和/或 mtkime 以当地语言生成从当前月份开始的接下来的 12 个月?

datetime replace locale mktime intldateformatter
1个回答
0
投票

我分享我自己的答案。

因此,在不使用

date()
mtkime()
的情况下,我检索当前月份的十二个月。

为此,我们需要在循环之前实例化 dateTime,并从 1 个月递减到当前月份,而不是 DateTime“修改”属性生成的下一个

$test->modify('+1 month')

对于每个循环,我们将 DateTime 增加到 +1 个月。

intlDateFormatter 负责格式化日期并翻译它

$now = Date('m');
$test = new DateTime('first day of this month - 1 month');

for ($x = $now ; $x < $now + 12 ; $x++) {
   $test->modify('+1 month');
   $use_formatter = new IntlDateFormatter('fr_FR');
   $use_formatter->setTimeZone('Europe/Paris');
   $use_formatter->setPattern('y-MMMM-MM');
   $formated = $use_formatter->format($test);
   var_dump($formated);
}
© www.soinside.com 2019 - 2024. All rights reserved.