格式化DateTime对象,尊重Locale :: getDefault()

时间:2012-01-05 15:23:09

标签: php datetime-format

我有一个DateTime对象,我正在通过

格式化
$mytime->format("D d.m.Y")

这给了我完全符合我需要的格式:

  

星期二5.3.2012

唯一缺少的是正确的语言。我需要TueTuesday)的德语翻译,即DieDienstag)。

这为我提供了正确的区域设置

Locale::getDefault()

但我不知道如何告诉DateTime::format使用它。

没有办法做某事:

$mytime->format("D d.m.Y", \Locale::getDefault());

3 个答案:

答案 0 :(得分:108)

您可以使用Intl扩展名格式化日期。它将根据所选的区域设置格式化日期/时间,或者您可以使用IntlDateFormatter::setPattern()覆盖该日期/时间。

使用自定义模式的快速示例,可能看起来像。

$dt = new DateTime;

$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT);
$formatter->setPattern('E d.M.yyyy');

echo $formatter->format($dt);

其中输出以下内容(至少今天)。

  

狄。 2013年4月6日


编辑:啊嘘!回答了一个古老的问题,因为有些评论将其列入了清单!现在至少提到了Intl选项。

答案 1 :(得分:57)

那是因为format没有注意语言环境。您应该使用strftime代替。

例如:

setlocale(LC_TIME, "de_DE"); //only necessary if the locale isn't already set
$formatted_time = strftime("%a %e.%l.%Y", $mytime->getTimestamp())

答案 2 :(得分:0)

这就是我结合 DateTime strftime()的功能解决的方法。

第一个允许我们管理具有奇怪日期格式的字符串,例如“ Ymd”(从日期选择器存储在db中)。 第二种功能使我们可以用某种语言翻译日期字符串。

例如,我们从一个值“ 20201129”开始,并希望以意大利语可读的日期结尾,并以天和月的名称结尾,首字母大写:“ Domenica 29 novembre 2020”。

// for example we start from a variable like this
$yyyymmdd = '20201129';

// set the local time to italian
date_default_timezone_set('Europe/Rome');
setlocale(LC_ALL, 'it_IT.utf8');

// convert the variable $yyyymmdd to a real date with DateTime
$truedate = DateTime::createFromFormat('Ymd', $yyyymmdd);

// check if the result is a date (true) else do nothing
if($truedate){

  // output the date using strftime
  // note the value passed using format->('U'), it is a conversion to timestamp
  echo ucfirst(strftime('%A %d %B %Y', $truedate->format('U')));

}

// final result: Domenica 29 novembre 2020