PHP DateTime::createFromFormat和多种语言


PHP DateTime::createFromFormat and multi languages

我在使用诸如"2016年4月15日"之类文本的日期使用DateTime::createFromFormat()

只要我使用英国文化,它就完全有效。

2016年4月15日->ok

我的代码被设置为WordPress插件。请理解,我无法控制给我日期(文本)和WordPress设置的组件。如果用户将WordPress安装设置为另一种语言,日期将从"2016年4月15日"更改为(如果是法语)"Avril 152016"。

看起来DateTime::createFromFormat()不支持英语以外的其他语言,所以"2016年4月15日"将以结尾

"致命错误:调用布尔值上的成员函数format()"

有人知道我们如何将月份日期作为几种语言的文本处理吗?在php中使用DateTime::createFromFormat()或其他方法?

感谢

有两种方法可以做到这一点,但都取决于输入的生成方式。。。

  1. 维护一系列月份名称翻译

这是一种简单/天真和最明显的方式,我认为不需要解释。

然而,根据WordPress(和/或你使用的插件)的工作方式,它可能也是你唯一的选择。

  1. IntlDateFormatter

这是纯粹的编程方式,因此被认为是"正确的"方式,但不幸的是,这个类是PECL扩展intl的一部分,并且没有与PHP捆绑在一起。

它还要求您在解析日期之前了解所使用的语言,但这应该不是问题,因为这是所有本地化解决方案最初应该如何工作的,所以我假设您可以在WordPress中获得这些信息
pickdate.js在默认情况下似乎也适用于标准区域设置。

话虽如此,以下是它的工作原理:

//请参阅http://userguide.icu-project.org/formatparse/datetime$inputFormat='MMMM-dd,yyyy';$inputDate='Avril 152016';$locale='fr_fr';//魔法来了。。。$dateFormatter=新的IntlDateFormatter($locale,IntlDateFormatter::LONG,//不是很重要,甚至可能是NONEIntlDateFormatter::NONE,//时间。。。我们不使用它NULL,//将使用date_default_timezone_get()NULL,//日历;我们不需要它$inputFormat);//失败时将返回bool(false),使用getErrorMessage()进行调试$unixTimestamp=$dateFormatter->parse($inputDate);

值得注意的是,IntlDateFormatter主要是为创建本地化的输出而设计的(这是正确的——你不应该首先解析翻译后的月份名称,或者根本不应该解析名称;数字FTW),所以我们确实在这里写了很多不相关的东西。对于您的用例,只有$locale$inputFormat参数很重要。

不过还有一个警告-我们需要一个时区
你可以通过(最好)$dateFormatter->getTimeZone()或在这种情况下只通过date_default_timezone_get()获得它,但你确实需要时区,原因有两个:

  1. 您的输入中没有时间值,因此IntlDateFormatter::parse()假定为"00:00:00"
  2. UNIX时间戳在UTC中总是,因此IntlDateFormatter::parse()将考虑到这一点,DateTime::createFromFormat('U', $unixTimestamp)将对象的时区设置为UTC

如果你在另一个时区,更具体地说,在世界东部的时区,就会发生这种情况:

$dateTime=dateTime::createFromFormat('U',$unixTimestamp);var_dump($dateTime->格式('Y-m-d'));//string(10)"2016-04-14"!!!$dateTime->setTimeZone(新的DateTimeZone($timezone));var_dump($dateTime->格式('Y-m-d'));//string(10)"2016-04-15"

可以首先告诉IntlDateFormatter您在UTC,但从技术上讲,这是欺骗(眨眼),根据您稍后使用$dateTime的内容,这可能会产生副作用。