我有一个DateTime对象,我目前正在通过
$mytime->format("D d.m.Y")
这正好给了我所需要的格式:
2012年3月5日星期二
唯一缺少的一点是正确的语言。我需要德语翻译的Tue
(Tuesday
),这是Die
(Dienstag
)。
这将为我提供正确的区域设置
Locale::getDefault()
但是我不知道如何告诉DateTime::format
使用它。
难道没有一种方法可以做这样的事情:
$mytime->format("D d.m.Y", \Locale::getDefault());
6条答案
按热度按时间oipij1gg1#
您可以使用Intl扩展来格式化日期。它将根据所选的区域设置来格式化日期/时间,或者您可以使用
IntlDateFormatter::setPattern()
覆盖它。使用自定义模式实现所需输出格式的快速示例如下所示。
它输出以下内容(至少今天是这样)。
2013年6月4日
pnwntuvh2#
这是因为
format
并不关注语言环境。您应该使用strftime
来代替。例如:
kqqjbcuj3#
IntlDateFormatter是目前(2022年)要走的路。
将给予不同的输出,这取决于您传递的
$locale
以及日期和时间格式。我想添加一些示例以供将来参考。注意IntlDateFormatter::GREGORIAN
和IntlDateFormatter::LONG
是可互换的。正如salathe已经说过的,如果需要,还可以使用
$formatter->setPattern
进一步定制输出。rta7y2nd4#
虽然
setlocale()
是正确的答案,仍然会工作,但现在已经过时了。strftime自PHP 8.1.0起已被弃用,强烈建议不要依赖此函数。
而且提到的Intl扩展工作得很完美,但并不总是得心应手。
处理日期和时间最简单的方法之一是使用Carbon2、CakePHP Chronos或类似的库。它为所有日期的操作、格式化和计算提供了一个单一的界面。如果你经常处理日期,我推荐使用Carbon,然后做类似的事情
请注意,该格式与
date()
不同。完整列表见Carbon文档,但提到的D d.m.Y
可能类似于dd DD.MM.YYYY
。如果你的项目接受第三方库,这确实是一个不错的选择。另外,如果你正在使用框架,请检查一下,也许Carbon(或其 Package 器)已经包含在内了。
8gsdolmq5#
我做了一些东西,只是这样做,因为似乎不存在一个简单的解决方案在任何地方在线,除了与
strftime
,这是非常不赞成!我的解决方案扩展了
DateTime::format()
的国际月份和日期名称,不需要安装一堆模块,学习新的日期格式化方法等。在包含下面提供的类之后,您可以按如下方式使用它。
结果:
Friday (Fri) 2010-Jan-01 (January)
您现在可以使用
结果:
vrijdag (vr) 2010-jan.-01 (januari)
(荷兰语区域设置)。如果需要,可以动态更改
$datetime->locale
。结果:
venerdì (ven) 2010-gen-01 (gennaio)
包括:
这段代码扩展了DateTime和DateTimeImmutable,用一个区域设置扩展了它们的正常格式。
如果需要,可以通过向数组中添加代码来添加要转换的新模式:
DateTime::format()
-语法中的格式化模式、IntlDateFormatter::format
-语法中的相应格式化模式,以及要在DateTime::format
中使用的占位符,该占位符不包含将由DateTime::format
方法使用/替换的字母/代码/模式。请参见当前四个代码的示例,这些代码不使用ASCII中低于128个字母的字母。(他们使用波兰语、希腊语、荷兰语和斯洛伐克语字母只是为了好玩。)在PHP 8.1中构建和测试。对于某些旧版本的PHP,您必须将第一个类更改为
z9ju0rcb6#
这就是我如何结合DateTime和**strftime()**的特性来解决的。
第一个允许我们管理带有奇怪日期格式的字符串,例如“Ymd”(从日期选择器存储在数据库中);第二个允许我们将日期字符串翻译成某种语言。
例如,我们从值“20201129”开始,并希望以意大利语可读日期结束,日期名称为day和month,第一个字母也是大写:2020年11月29日,多明尼加。