如何解析任何日期格式

时间:2011-09-21 19:29:26

标签: php date

我正在努力创造一些聪明的东西,以便以任何国际格式解析日期。

在我的前端,我使用jquery ui作为日期选择器,每种语言都有其特定的日期格式。

Fr:d / m / Y. 恩:m / d / Y. ...

好的但是现在在php部分我必须使用相同的格式存储这些日期(Mysql Y-m-d)。我想避免使用switch case和类似的东西,所以我开始寻找另一种选择。

我发现的最好的事情是

http://www.php.net/manual/en/datetime.createfromformat.php如果我知道格式,该函数将使我能够解析日期。

例如

$format = 'Y-m-d';
$date = DateTime::createFromFormat($format, '2009-02-15');

好的,这是一个好的开始,但现在我想找到当前语言环境的标准日期格式。

所以我发现了这个:

http://www.php.net/manual/en/intldateformatter.getpattern.php

但我真的不知道如何让它发挥作用,因为我得到了不可思议的结果:

php > $i = new IntlDateFormatter("fr_FR.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE);
php > echo $i->getPattern();
dd/MM/yy
/* correct ! */

php > $i = new IntlDateFormatter("en_US.utf8",IntlDateFormatter::SHORT,IntlDateFormatter::NONE);
php > echo $i->getPattern();                                                    
M/d/yy /* wtf */

我错过了什么吗?

由于

1 个答案:

答案 0 :(得分:1)

没有“通用日期格式符号标准”。符号“y”可以是2位数年份,4位数年份,甚至3个字母缩写月份(极不可能),具体取决于来源。

IntlDateFormatter的格式符号记录在案here。从文档中可以看出,对于此实现,“d”是没有前导零的日期,而“dd”包含前导零。 “M”和“MM”都代表带有前导零的月份。 “yy”是2位数年份。

这与jQuery UI的日期格式符号之间存在足够的差异,您需要使用数据映射将IntlDateFormatter格式符号映射到jQuery UI datepicker format symbols,反之亦然。

这样的事情应该足够(未经测试):

// PHP => jQuery
$formatMap = array(
    'dd' => 'dd',
    'd'  => 'd',
    'MM' => 'mm',
    'M'  => 'mm',
    'yy' => 'y'
    // and so on...
);

设置完地图后,您可以根据区域设置创建IntlDateFormatter,将该格式的符号转换为jQuery UI日期格式符号,然后将格式发送到前端。

当用户回发所选日期时,您可以反向执行相同操作以返回IntlDateFormatter符号。此时,您可以使用IntlDateFormatter::setPattern()的组合将格式设置为MySQL样式,并使用datefmt_format()(或等效的)来实际设置发布日期的格式。

希望这有帮助。