【问题标题】:PHP : Better date parser than strtotimePHP:比 strtotime 更好的日期解析器
【发布时间】:2013-09-04 17:16:18
【问题描述】:

我正在尝试解析特定格式的字符串,但我很惊讶地发现我找不到一个好的函数来做到这一点。

我找到的唯一一个是 strtotime,它不适合它猜测日期格式。我真的不相信“猜测”部分。 此外,我的字符串输入是法语格式(dd/mm/aaaa),似乎不太好理解(它解析美国格式,如 mm/dd/aaaa)。

我正在寻找的是一个函数,它接受输入日期字符串和要解析的格式。 我可以用正则表达式自己做,但我不敢相信它还不存在。

我找到了:

  • DateTime::createFromFormat()。但它只适用于 PHP 5.3,我无权升级 PHP 版本(5.2)
  • strptime()。这个方法做我想要的但没有在windows平台上实现(顺便说一句:WTF ??)

有什么建议吗?

【问题讨论】:

  • “我真的不相信“猜测”部分。”但是如果字符串已经被特别格式化,那么什么是不信任的呢?
  • er - dd/mm/yyyy 是英文格式。 mm/dd/yyyy 是美式格式
  • 我知道,但是重新格式化输入字符串肯定是微不足道的,而且比仅仅为此使用外部依赖更好。
  • 附带问题...有谁知道为什么 strptime() 没有在 windows 上实现?

标签: php


【解决方案1】:

不幸的是,manually 似乎更好地完成这种解析,方法是在斜杠处分解字符串,然后切换日期和月份。

【讨论】:

  • 是的,翻转月份/日期然后运行 ​​strtotime() 一点也不难。
  • 只是为了“不重新发明轮子”。但是如果我解析它,strtotime 是没用的,我更喜欢使用 mktime()。
  • 已接受。因为虽然其他答案是正确的,但它们手动解析并使用 strtotime() ,而一旦字符串已经被解析,它似乎就毫无用处了。最好的解决方案似乎是使用正则表达式来解析字符串,然后使用 mktime() 来获取 unix 时间。
【解决方案2】:

查看Zend_Date,它允许您在设置日期时指定格式。除了constants for many common formats,你也可以specify your own

$date = new Zend_Date();
$date->set('27/08/2009','DD/MM/YYYY');

【讨论】:

    【解决方案3】:

    php.net 对 strtotime 的以下评论可能会有所帮助:

    在非美国日期失败 顺序不确定,例如 01/02/2003 - 将其解析为 2 月 1 日, 而不是 1 月 2 日。

    如果您要解析非美国的日期 语言环境,你可以翻转这些元素 你的日期:

    <?php 
    $y = $_POST['date']; 
    if (preg_match('/^\s*(\d\d?)[^\w](\d\d?)[^\w](\d{1,4}\s*$)/', $y, $match)) { 
      $y = $match[2] . '/' . $match[1] . '/' . $match[3]; 
    } 
    echo date('d # m # Y', strtotime($y)); 
    ?> 
    

    警告:以上仅适用于日期, 休息时间:12:30:01 将是 转换为 30/12/01。

    【讨论】:

      【解决方案4】:

      我自己写了一个类,我想你会在http://sourceforge.net/projects/phpdbedittkhttp://sourceforge.net/projects/phpdbedittk的gadmdatecommand.php中找到一个ok的版本

      关于这里的cmets只是用'/'爆炸并交换数字,它并不是那么简单。如果您提议在输入框中输入日期,您可能会得到 - 取决于用户和应用程序的位置

      2010 年 1 月 7 日 1.7.2010 1-7-2010 7月15日 2010 年 7 月 1 日 1/6/8

      还有更多变体。我已经通过创建日期格式解决了这个问题(至少对我来说是成功的),每个都有 a) 匹配格式的正则表达式 b) 将正则表达式括号匹配为日期片段(日、月、分钟、上午/下午)的数组映射器 c) date() 的输出格式

      HTH

      【讨论】:

        【解决方案5】:

        如果您知道您的日期格式输入将是英文格式,那么您可以将其处理为更标准的日期格式。 24/7/20072007-07-24 的简单解析是微不足道的。用正斜线爆炸并将零件放在正确的位置。我知道strtotime 会正确解析2007-07-24

        【讨论】:

          【解决方案6】:

          strptime():
          在内部,该函数调用系统 C 库提供的 strptime() 函数。此函数可以在不同的操作系统中表现出 (!) 明显不同的行为。建议在 PHP 5.3.0 及更高版本上使用 date_parse_from_format(),它不会遇到这些问题
          http://www.php.net/manual/en/function.strptime.php

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-11-08
            • 1970-01-01
            • 2015-08-17
            • 1970-01-01
            • 1970-01-01
            • 2013-04-19
            • 1970-01-01
            相关资源
            最近更新 更多