PHP日期 - 以当地语言获取月份名称

Sas*_*sha 17 php localization date

我有这部分功能,它给了我英文月份的名称.我怎样才能将它们翻译成我的当地语言(塞尔维亚语)?

$month_name = date('F', mktime(0, 0, 0, $i));
Run Code Online (Sandbox Code Playgroud)

MAX*_*XIM 25

你应该使用setlocale():

setlocale(LC_TIME, 'fr_FR');
$month_name = date('F', mktime(0, 0, 0, $i));
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它会将其设置为法语.对于您的情况,它应该是以下之一:

  1. sr_BA - 塞尔维亚语(黑山)
  2. sr_CS - 塞尔维亚语(塞尔维亚)
  3. sr_ME - 塞尔维亚语(塞尔维亚和黑山)

  • 我的'date`是不知道的语言环境,我的`strftime`不是.如果你的语言环境是知道的...你的PHP版本是什么? (8认同)
  • 但请注意[`setlocale`将语言环境进程设置为宽](http://php.net/manual/en/function.setlocale.php#refsect1-function.setlocale-notes)(在使用多个线程时导致多线程出现意外行为) -threading).线程安全替代:[IntlDateFormatter](http://php.net/manual/en/class.intldateformatter.php) (3认同)
  • 此解决方案不正确。假设现在是 2019-01-30,没有第五个和第六个参数的函数 mktime() 将使用当前的日期和年份,所以如果是 2019-01-30 并且你想知道 $i = 2 (February),结果将是三月,因为 2019-02-30 不存在,它将被解释为三月的日期。为避免此问题,请使用例如:mktime(0, 0, 0, $i, 1, 2019)。无论如何,不​​要使用此解决方案,因为它会在某些特定日期给出错误的结果。Stackoverflow 上有这么多不正确的答案...... (2认同)

Jas*_*els 17

你应该使用setlocale()strftime():

setlocale(LC_TIME, 'sr_CS');
$month_name = strftime('%B', mktime(0, 0, 0, $i));
Run Code Online (Sandbox Code Playgroud)

  • PHP 8.l 中已弃用“strftime()” (3认同)

Arn*_*aud 9

这是一个IntlDateFormatter的例子

$format = new IntlDateFormatter('sr_CS', IntlDateFormatter::NONE, 
              IntlDateFormatter::NONE, NULL, NULL, "MMM");
$monthName = datefmt_format($format, mktime(0, 0, 0, $i));
Run Code Online (Sandbox Code Playgroud)


Kai*_*ack 7

对于所有与德语(和de_DE)斗争的人,请确保您使用正确的语言代码。登录到您的服务器并运行locale -a以查看所有可用服务器的列表。对我来说,它显示:

C
C.UTF-8
de_AT.utf8
de_BE.utf8
de_CH.utf8
de_DE.utf8
de_LI.utf8
de_LU.utf8
...

您需要使用这些代码之一。

然后你可以使用:

date_default_timezone_set('Europe/Berlin');
setlocale(LC_ALL, 'de_DE.utf8');
$date_now = date('Y-m-d');
$month_available = strftime('%B %Y', strtotime($date_now));
$month_next = strftime('%B %Y', strtotime($date_now.' +1 month'));

Run Code Online (Sandbox Code Playgroud)

和“März 2020”等正确显示。


jav*_*web 6

这个问题询问如何获取月份列表,我只看到提示,而不是完整的代码答案,所以:

如果您有IntlDateFormatter可用的 - 在大多数情况下可用,您可以在给定的区域设置中创建一个格式化程序,并重复将日期推送到仅根据月份编号创建的日期

// or any other locales like pl_PL, cs_CZ, fr_FR, zh, zh_Hans, ...
$locale = 'en_GB';
$dateFormatter = new IntlDateFormatter(
    $locale,
    IntlDateFormatter::LONG, // date type
    IntlDateFormatter::NONE  // time type
);
$dateFormatter->setPattern('LLLL'); // full month name with NO DECLENSION ;-)
$months_locale = [];
for ($month_number = 1; $month_number <= 12; ++$month_number) {
    $months_locale[] = $dateFormatter->format(
        // 'n' => month number with no leading zeros
        DateTime::createFromFormat('n', (string)$month_number)
    );
}
// test output
echo "<pre>";
var_dump($months_locale);
echo "</pre>";
Run Code Online (Sandbox Code Playgroud)

注意: LLLL照顾不下降,但如果语言有这样的事情,它不会照顾第一个字母的小写/大写。
一个很好的例子是,你可以得到Januaryforen_GBledenforcs_CZ
如果你想要所有字母小写 => 使用mb_strtolower($month_name);- docs
如果你只想第一个字母大写 =>
=> 使用mb_convert_case($month_name, MB_CASE_TITLE, 'UTF-8');- docs

始终对mb_*源自语言环境的字符串使用函数或其变体!

所以不,不要使用ucfirst