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

注意我来自.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');
?>

===============>>#1 票数: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日期格式化格式代码不同, 这里是已识别代码的文档。

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

y年M月d日EEEE

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

  ask by justageezer translate from so

未解决问题?本站智能推荐:

2回复

PHP中使用IntlDateFormatter的本地化(短)月份名称?

在我的Windows开发机器上,我已将语言环境设置为ita : setlocale(LC_TIME, 'ita'); echo strftime('%b'); // dic 虽然(我想,现在无法测试)在* nix系统上,我应该使用it : setlocale(LC_TIME, 'it'
1回复

PHP Intl库和人类可读的时间跨度

我正在使用PHP Intl库来格式化日期,数字等。 现在我必须在人类可读字符串中显示时间跨度,例如: 1天,1小时,10分钟,14秒 或以紧凑的方式: 1d 1s 10m 14s 或者以超紧凑的方式: 1d 1.10:14 有没有办法使用没
1回复

PHP PECL扩展intl给出了瑞典序数的乱码结果

我正在使用PECL intl模块来本地化PHP项目中的日期和数字。 在我正在使用的所有其他语言中(40),本地化序数很好。 然而,在瑞典语中,我得到了奇怪的输出。 它似乎是用于生成序数的模板常量。 和 两者都返回1:e%digits-ordinal-neutre:0: 1:
4回复

Symfony2与intl扩展问题。 我似乎无法启用扩展程序

我遇到了一些问题,我知道这些问题会出现在symfony2中。 这一切都归结为需要安装和启用intl扩展。 我正在使用mamp pro并试图遵循这些教程: http://szemian.wordpress.com/2011/03/21/compiling-intl-extension
1回复

将日期从日历类型转换为另一种类型

我需要一个函数来将波斯日历中的日期转换成对应的公历日期。 我按照此页面的示例#3编写了以下函数。 不幸的是,它有效吗? 怎么了 使用Intl扩展名的正确方法是什么? 可以在这里找到有关Intl的很好的介绍: http : //devzone.zend.com/1500/inter
1回复

IntlDateFormatter PHP日语年份转换为2019返回false

我想转换 参考https://www.conservapedia.com/Japanese_dates 在这里我得到这些 为此,我尝试了下面的代码,在这里“ 平成31年8月 ”返回了2019年,但根据ref,它应该令和元年8月建议我有任何解决方案,因此我可以将自己的代码
2回复

日期/ strftime格式与语言字符串| PHP

我需要一个解析日期字符串但用不同语言的语言字符串替换的解决方案,例如 英语 我需要通过日期/ strftime函数传递语言字符串,但不仅会传递英语,还会传递其他语言(当它们被选中时)。 因此,如果选择了其他语言,语言字符串将更改为所选语言。 例如,法语: 所以当使用这样
2回复

PHP Spoofchecker类

我正在阅读PHP手册,并在intl扩展文档页面中遇到了Spoofchecker类 。 类中的方法,它们的参数以及类本身都是公平的,所以我想知道它的目的是什么。
2回复

使用PHP strftime()和date()格式字符串

我正在维护PHP代码,这似乎使日期/时间处理非常混乱。 特别是,此应用程序在其他语言环境中不能很好地工作。 问题之一是使用不可本地化的date()函数而不是strftime()函数。 它在函数内部深处使用了几层,实际上使用了数千次,遍历了许多不同格式的字符串。 用strftime
1回复

PHP strftime语言环境在刷新时发生更改

我在项目中使用strftime,但在设置区域设置并打印出来时遇到了一个奇怪的错误。 这里的代码: 输出如下: Denstag,den 26.2013年11月um 08:33 这是正确的,但是如果刷新页面,则会得到以下信息(20之内一次) 星期二,巢穴26。2