protected function dateToUnix()
{
if (!static::isNumericFormat($this->strFormat)) {
throw new \Exception(sprintf('Invalid date format "%s"', $this->strFormat));
}
$intCount = 0;
$intDay = '';
$intMonth = '';
$intYear = '';
$intHour = '';
$intMinute = '';
$intSecond = '';
$blnMeridiem = false;
$blnCorrectHour = false;
$arrCharacterMapper = array('d' => 'intDay', 'j' => 'intDay', 'm' => 'intMonth', 'n' => 'intMonth', 'y' => 'intYear', 'Y' => 'intYear', 'h' => 'intHour', 'H' => 'intHour', 'g' => 'intHour', 'G' => 'intHour', 'i' => 'intMinute', 's' => 'intSecond');
$arrCharacters = str_split($this->strFormat);
foreach ($arrCharacters as $strCharacter) {
$var = isset($arrCharacterMapper[$strCharacter]) ? $arrCharacterMapper[$strCharacter] : 'dummy';
switch ($strCharacter) {
case 'a':
case 'A':
$blnCorrectHour = true;
$blnMeridiem = strtolower(substr($this->strDate, $intCount, 2)) == 'pm' ? true : false;
$intCount += 2;
break;
case 'd':
case 'm':
case 'y':
case 'h':
case 'H':
case 'i':
case 's':
${$var} .= substr($this->strDate, $intCount, 2);
$intCount += 2;
break;
case 'j':
case 'n':
case 'g':
case 'G':
${$var} .= substr($this->strDate, $intCount++, 1);
if (preg_match('/[0-9]+/', substr($this->strDate, $intCount, 1))) {
${$var} .= substr($this->strDate, $intCount++, 1);
}
break;
case 'Y':
${$var} .= substr($this->strDate, $intCount, 4);
$intCount += 4;
break;
default:
++$intCount;
break;
}
}
$intHour = (int) $intHour;
if ($blnMeridiem) {
$intHour += 12;
}
if ($blnCorrectHour && ($intHour == 12 || $intHour == 24)) {
$intHour -= 12;
}
if ($intMonth == '') {
$intMonth = 1;
}
if ($intDay == '') {
$intDay = 1;
}
if ($intYear == '') {
$intYear = 1970;
}
// Validate the date (see #5086 and #7955)
if (!is_numeric($intMonth) || !is_numeric($intDay) || !is_numeric($intYear) || checkdate($intMonth, $intDay, $intYear) === false) {
throw new \OutOfBoundsException(sprintf('Invalid date "%s"', $this->strDate));
}
$this->strDate = mktime((int) $intHour, (int) $intMinute, (int) $intSecond, (int) $intMonth, (int) $intDay, (int) $intYear);
}