【问题标题】:How to parse any date format如何解析任何日期格式
【发布时间】:2011-09-21 19:29:26
【问题描述】:

我正在尝试做一些聪明的事情来解析任何国际格式的日期。

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

Fr: d/m/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/2/3 是什么。 03 年 2 月 1 日? 01 年 2 月 3 日? 02 年 3 月 1 日?等等等等等等。尝试和适应是很好的,但有时你必须坚持以某种形式呈现。
  • 将存储的格式将是特定格式,但我需要解析用户传递的日期。
  • 是的,但同样...如果您允许用户提供诸如 1/2/3 之类的内容,则无法可靠地解析它。就像我说的那样,在输入上保持灵活性很好,而且花花公子,但在某些时候,坚持固定格式比试图让自己陷入困境更容易。
  • 问题是,由于我使用日期选择器,格式实际上是强制使用正确的语言环境格式,所以我认为这足以信任
  • 好吧,你拯救了我的一天jqueryui.com/demos/datepicker/#option-altFormat

标签: php date


【解决方案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()(或等效项)来实际格式化发布日期。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2014-09-26
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 2018-07-09
    相关资源
    最近更新 更多