如何解析任何日期格式

4

我正在尝试制作一个聪明的东西,以便解析任何国际格式的日期。

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

法语: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 */

我漏掉了什么吗?谢谢。

8
在某个时候,你需要坚定立场并自己决定一个格式。否则你就会一直试图弄清楚1/2/3是什么意思。是02年3月1日还是01年2月3日?等等。尝试着迁就别人是好的,但有时你必须坚持要求以某种特定格式呈现。 - Marc B
2
是的,但是......如果您允许用户输入像1/2/3这样的内容,那么您无法可靠地解析它。就像我说的,对输入进行灵活处理很好,但在某些时候,坚持固定格式比试图把自己扭成一个结更容易。 - Marc B
如果你能找出如何强制日期选择器以单一格式提交,你的生活将会变得更加轻松。 - Marc B
1
好的,你救了我的一天 http://jqueryui.com/demos/datepicker/#option-altFormat - Paté
如果您选择本地日期格式,则可以接受1/2/3。例如,如果区域设置为it_IT,则应将1/2/3解析为dd/mm/yy,即1903年2月1日。 - Dario de Judicibus
显示剩余4条评论
1个回答

1

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

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

这与jQuery UI的日期格式符号之间存在足够的差异,您需要一个数据映射将IntlDateFormatter格式符号映射到jQuery UI日期选择器格式符号,反之亦然。

像这样的东西应该足够了(未经测试):

// 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()(或等效函数)来实际格式化回传的日期。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接