• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • date_parse_from_format()

    (PHP 5 >= 5.3.0, PHP 7)

    Get info about given date formatted according to the specified format

    说明

    date_parse_from_format(string $format,string $date): array

    Returns associative array with detailed info about given date.

    参数

    $format

    Format accepted byDateTime::createFromFormat().

    $date

    String representing the date.

    返回值

    Returns associative array with detailed info about given date.

    更新日志

    版本说明
    7.2.0Thezoneelement of the returned array represents seconds instead of minutes now, and its sign is inverted. For instance-120is now7200.

    范例

    Example #1date_parse_from_format()example

    <?php
    $date = "6.1.2009 13:00+01:00";
    print_r(date_parse_from_format("j.n.Y H:iP", $date));
    ?>
    

    以上例程会输出:

    Array
    (
        [year] => 2009
        [month] => 1
        [day] => 6
        [hour] => 13
        [minute] => 0
        [second] => 0
        [fraction] => 
        [warning_count] => 0
        [warnings] => Array
            (
            )
        [error_count] => 0
        [errors] => Array
            (
            )
        [is_localtime] => 1
        [zone_type] => 1
        [zone] => 3600
        [is_dst] => 
    )
    

    参见

    • DateTime::createFromFormat() 根据给定的格式解析日期时间字符串
    • checkdate() 验证一个格里高里日期
    For use in Versions prior V5.3:
    <?php
    if (!function_exists('date_parse_from_format')) {
      function date_parse_from_format($format, $date) {
        // reverse engineer date formats
        $keys = array(
          'Y' => array('year', '\d{4}'),
          'y' => array('year', '\d{2}'),
          'm' => array('month', '\d{2}'),
          'n' => array('month', '\d{1,2}'),
          'M' => array('month', '[A-Z][a-z]{3}'),
          'F' => array('month', '[A-Z][a-z]{2,8}'),
          'd' => array('day', '\d{2}'),
          'j' => array('day', '\d{1,2}'),
          'D' => array('day', '[A-Z][a-z]{2}'),
          'l' => array('day', '[A-Z][a-z]{6,9}'),
          'u' => array('hour', '\d{1,6}'),
          'h' => array('hour', '\d{2}'),
          'H' => array('hour', '\d{2}'),
          'g' => array('hour', '\d{1,2}'),
          'G' => array('hour', '\d{1,2}'),
          'i' => array('minute', '\d{2}'),
          's' => array('second', '\d{2}')
        );
        // convert format string to regex
        $regex = '';
        $chars = str_split($format);
        foreach ($chars AS $n => $char) {
          $lastChar = isset($chars[$n - 1]) ? $chars[$n - 1] : '';
          $skipCurrent = '\\' == $lastChar;
          if (!$skipCurrent && isset($keys[$char])) {
            $regex .= '(?P<' . $keys[$char][0] . '>' . $keys[$char][1] . ')';
          } else if ('\\' == $char) {
            $regex .= $char;
          } else {
            $regex .= preg_quote($char);
          }
        }
        $dt = array();
        $dt['error_count'] = 0;
        // now try to match it
        if (preg_match('#^' . $regex . '$#', $date, $dt)) {
          foreach ($dt AS $k => $v) {
            if (is_int($k)) {
              unset($dt[$k]);
            }
          }
          if (!checkdate($dt['month'], $dt['day'], $dt['year'])) {
            $dt['error_count'] = 1;
          }
        } else {
          $dt['error_count'] = 1;
        }
        $dt['errors'] = array();
        $dt['fraction'] = '';
        $dt['warning_count'] = 0;
        $dt['warnings'] = array();
        $dt['is_localtime'] = 0;
        $dt['zone_type'] = 0;
        $dt['zone'] = 0;
        $dt['is_dst'] = '';
        return $dt;
      }
    }
    ?>
    Not my invention though. I found it here: http://stackoverflow.com/questions/6668223/php-date-parse-from-format-alternative-in-php-5-2
    Thought this might be a good place to keep a copy in case someone stumbles upon the same problem facing outdated PHP versions on customer servers ....
    $date = "10 October 2018 19:30 pm";
    print_r (date_parse_from_format("j F Y G:i a", $date));
    Output:
    Array (
      [year]     => 2018
      [month]     => 10
      [day]      => 10
      [hour]     => 31
      [minute]    => 30
      [second]    => 0
      [fraction]   =>
      [warning_count] => 1
      [warnings]   => Array (
                [24] => The parsed time was invalid
              )
      [error_count]  => 0
      [errors]    => Array ( )
      [is_localtime] =>
    )
    19:30 pm is invalid, 24-hour format of an hour can't be used with am/pm
    must be replaced with:
    $date = "10 October 2018 19:30";
    print_r (date_parse_from_format("j F Y G:i", $date));
    or:
    $date = "10 October 2018 7:30 pm";
    print_r (date_parse_from_format("j F Y g:i a", $date));

    上篇:date_offset_get()

    下篇:date_parse()