public static function parseFromFormat($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 (!jDateTime::checkdate($dt['month'], $dt['day'], $dt['year'], false)) {
$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'] = '';
if (strlen($dt['year']) == 2) {
$now = self::forge('now');
$x = $now->format('Y') - $now->format('y');
$dt['year'] += $x;
}
$dt['year'] = isset($dt['year']) ? (int) $dt['year'] : 0;
$dt['month'] = isset($dt['month']) ? (int) $dt['month'] : 0;
$dt['day'] = isset($dt['day']) ? (int) $dt['day'] : 0;
$dt['hour'] = isset($dt['hour']) ? (int) $dt['hour'] : 0;
$dt['minute'] = isset($dt['minute']) ? (int) $dt['minute'] : 0;
$dt['second'] = isset($dt['second']) ? (int) $dt['second'] : 0;
return $dt;
}