2011-09-21 89 views
4

我试图做一些聪明的事情,以解析任何国际格式的日期。如何解析任何日期格式

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

FR:d/M/Y 恩:M/d/Y ...

确定的,但现在对PHP的一部分,我必须存储使用相同的格式(Mysql的Y-M-d)的日期。我想避免使用开关盒和类似的东西,所以我开始寻找另一种选择。

我发现的最好的事情是

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

但我真的不知道如何得到它的工作,因为我得到inconstitent结果:

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 */ 

我错过了什么吗?

谢谢

+8

在某个时候,你必须放下自己的脚,自己决定一种格式。或者你最终会试图弄清楚1/2/3是什么。 03年2月1日? 01年2月3日? '02年3月1日?等等等等等等。很高兴尝试和适应,但有时你必须坚持要求事物具有某种格式。 –

+0

将被存储的格式将采用特定的格式,但我需要解析用户传递的日期。 –

+2

是的,但是,如果您允许用户使用1/2/3等内容,则无法可靠地解析该内容。就像我说的那样,对投入灵活一点都很好,而且在某种程度上,坚持固定格式更容易,而不是试图让自己变成一个结。 –

回答

1

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

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

这个和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()(或同等格式)来实际设置发布日期的格式。

希望这会有所帮助。