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.0 | Thezoneelement 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));