PHP < 5.3.0 中的 DateTime::createFromFormat

3
我正在寻找一个与DateTime::createFromFormat相同的函数,但我需要它能在低于v5.3版本的PHP环境中运行。基本上,我需要提供一个格式,就像您使用Date()函数一样,然后我需要根据该格式解析/验证字符串,如果字符串格式正确且为有效日期,则返回时间戳。

有人知道我可以在哪里找到类似的东西吗?还是说我必须自己编写?

再次强调,这必须使用提供的特定格式作为参数来工作。格式可以是任何内容,因此不能保证可以仅使用strtotime()函数。

5个回答

6

DateTime::createFromFormatdate_parse_from_format在PHP 5.3中被添加,因为有很高的需求,尤其是来自为不使用美国日期/时间格式的用户编写代码的开发人员。


在这之前,您必须开发一个特定的函数来解析您正在使用的格式;对于PHP&lt; 5.3,通常会执行以下操作:

  • 决定应用程序将接受哪种格式
  • 显示一些消息,例如"your input should be JJ/MM/AAAA" (法语为DD/MM/YYYY)
  • 检查输入是否正确,关于该格式
  • 并将其解析以将其转换为PHP可以理解的日期/时间。

这意味着应用程序和开发人员通常不允许使用太多格式,因为每种格式都意味着一个不同的附加验证+解析函数。

如果你真的需要这种功能,允许任何可能的格式,恐怕你得自己写它 :-(
也许看一下date_parse_from_format的源代码可以帮助你,如果你懂C代码的话?它应该在类似于ext/date/php_date.c的东西中--但看起来并不那么简单:它调用timelib_parse_from_format函数,该函数定义在ext/data/lib/parse_date.c中,看起来并不友好^^

4

3

您可以使用strptime()函数,它使用strftime()格式。与date()格式有点不同,但几乎可以完成相同的工作。

function createFromFormat($strptimeFormat, $date) {
    $date = strptime($date, $strptimeFormat);
    $date['tm_year'] += 1900;
    $date['tm_mon']++;
    $timestamp = mktime($date['tm_hour'], $date['tm_min'], $date['tm_sec'], $date['tm_mon'], $date['tm_mday'], $date['tm_year']);
    return new DateTime('@'. $timestamp);
}

1

对于 PHP 版本低于 5.3 的情况,我使用以下函数来从格式为 'DD.MM.YYYY' 的字符串中获取 DateTime 对象。

function ParseForDateTimeValue ($strText)
{
    if ($strText != "")
    {
        if (ereg("^([0-9]{1,2})[/\.]\s*([0-9]{1,2})[/\.]\s*([0-9]{2,4})$",$strText,$arr_parts)) {

            $month = ltrim($arr_parts[2], '0');
            $day = ltrim($arr_parts[1], '0');
            $year = $arr_parts[3];

            if (checkdate($month, $day, $year)) {
               return new DateTime(date('Y-m-d H:i:s', mktime(0, 0, 0, $month, $day, $year));
            }
        }
    }
    return NULL;
}
  • 首先验证输入是否正确。
  • 然后提取月份、日期和年份。
  • 使用checkdate函数验证日期的有效性。
  • 将其转换为时间戳并传递给DateTime构造函数,最后返回它。

0
你可以创建一个时间戳,然后通过date()函数运行它来创建。要创建时间戳,你可以对获取的字符串进行一些explode操作。
$tomorrow = mktime(0,0,0,date("m"),date("d")+1,date("Y"));
echo "Tomorrow is ".date("Y/m/d", $tomorrow);

但是我希望最终结果是时间戳。我需要从类似createDateFromFormat("j/t|n|'y", "22/28|2|'10");的东西开始,最终获得对应于2010年2月22日的时间戳。 - Richard JP Le Guen

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