繁体   English   中英

具有intl-aware日后缀的PHP日期格式?

[英]PHP date format with intl-aware day suffix?

对不起,如果这是一个骗局 - 很多类似的问题,但很明显,如果我能找到一个确切的答案,我不会问:)

注意我来自.Net并且是一个PHP新手,因此可能存在noob-scale错误。

我希望能够输出例如新的DateTime('2014-01-01 13:15:00'):'2014年1月1日星期三下午1:15'(可能 - 非本地化)或'Mercredi 1er Janvier2014à13h15'(不可能?)。

基本上,似乎没有ISO格式等同于PHP的'S'日期格式说明符,strftime也没有?

IntlDateFormatter :: FULL接近 - 但是'1月1日星期三'或'mercredi 1 janvier'不是很好的英语(或法语) - 但它似乎是我能得到的最接近的? 如果必须的话,我可以在没有'on','the'和'at'的情况下生活,但序数后缀会很好。 ('星期三一月' - 那是什么,开始写一首诗?)

我确实在PHP.net上的strftime部分评论中看到了一个解决这个问题的例子 (这似乎表明这是一个问题) - 但它似乎只是添加了英文后缀,这似乎没什么用? 我想要一个简单的方法,它采用UTC日期时间,语言环境和时区,并输出一个本地化的字符串 - 最好采用“正确”的人类可读格式(如上所述),这在英语中是可能的。 我想在不为世界上的每种语言编写格式字符串的情况下实现这一目标。 如果它在我的Windows开发盒以及* nix生产盒上工作也会很好。

<?php
$utcdate = new DateTime('2014-01-01 13:15:00', new DateTimeZone('UTC'));
echo $utcdate->format('l \t\h\e jS \o\f F Y \a\t g:ia') . "<br>";
function dumpDates($date, $locale, $tz){
    $date->setTimeZone(new DateTimeZone($tz));
    $fmt = new IntlDateFormatter( $locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL,
         $tz, IntlDateFormatter::GREGORIAN  );
    echo $fmt->format($date) . "<br>";
    // doesn't work under windows?
    setLocale(LC_TIME, $locale);
    echo strftime('%A, %#d %B %Y %I:%M:%S %p', $date->getTimeStamp()) . "<br>";

}
dumpDates($utcdate, 'en_GB', 'Europe/London');
dumpDates($utcdate, 'de_DE', 'Europe/Berlin');
dumpDates($utcdate, 'fr_FR', 'Europe/Paris');
?>

如你所说,这个问题的全部内容 - 包括完全语法易读性 - 将很难做到,为世界上的每种语言编写格式字符串,或者找到包含这些字符串的库。 MomentJs似乎提供了很好的国际支持,但经过粗略的搜索后,除了intl扩展之外,我还找不到PHP等价物。

您可以通过使用IntlDateFormatter和NumberFormatter的组合来提供包含基于序数的数字的国际化表单,首先使用NumberFormatter获取日期的序数后缀/前缀的模式:

$numFmt = new NumberFormatter('fr_FR', NumberFormatter::ORDINAL);
$ordinalDay = $numFmt->format($date->format('j'));

然后,您可以创建一个IntlDateFormatter,它允许您检索目标语言的完整日期格式的模式:

$dateFormat = new IntlDateFormatter('fr_FR', IntlDateFormatter::FULL, IntlDateFormatter::FULL, $tz, IntlDateFormatter::GREGORIAN);
$datePattern = $dateFormat->getPattern();

最后,您需要使用转义序数日模式替换表示日期的$ datePattern中的部分:

$datePattern = preg_replace('/d+', "'"+$ordinalDay+"'", $datePattern);
$dateFormat->setPattern($datePattern);
$outputDate = $dateFormat->format($date);   

请注意,IntlDateFormatter使用的模式与通常的PHP日期格式化格式代码不同, 这里是已识别代码的文档。

一个警告; 在标准化程度相当严格的国际化格式中,序数看起来不合适。 例如,在中文中,格式为:

y年M月d日EEEE

并且在日期值之前插入对于书面中文存在的序数前缀对于中国读者来说可能看起来很奇怪。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM