我有一个DateTime对象,我正在通过
格式化$mytime->format("D d.m.Y")
这给了我完全符合我需要的格式:
星期二5.3.2012
唯一缺少的是正确的语言。我需要Tue
(Tuesday
)的德语翻译,即Die
(Dienstag
)。
这为我提供了正确的区域设置
Locale::getDefault()
但我不知道如何告诉DateTime::format
使用它。
没有办法做某事:
$mytime->format("D d.m.Y", \Locale::getDefault());
答案 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