很抱歉,如果这是一个骗局 - 很多类似的问题,但很明显,如果我能找到一个确切的答案,我不会问:)
注意我来自.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部分评论中看到one example解决了这个问题(这似乎表明这是一个问题) - 但它似乎只是添加了英文后缀,似乎没有用得多吗?我想要一个简单的方法,它采用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');
?>
答案 0 :(得分:0)
这个问题的全部内容 - 包括完整的语法易读性 - 如果没有,就像你说的那样,为世界上的每种语言编写格式字符串,或者找到包含这些字符串的库,这将是非常困难的。 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日期格式设置格式代码不同,here是已识别代码的文档。
警告;在标准化程度相当严格的国际化格式中,序数看起来不合适。例如,中文,格式为:
y年M月d日EEEE
并且在日期值之前插入对于书面中文存在的序数前缀对于中国读者来说可能看起来很奇怪。