/** * Internal _createFromFormat implementation for 5.2 * @internal * @param string $format Format like in date() * @param string $time Time string to parse * @param DateTimeZone $timezone TZ * @return SugarDateTime * @see DateTime::createFromFormat */ protected static function _createFromFormat($format, $time, DateTimeZone $timezone = null) { $res = new self(); if (!empty($timezone)) { $res->setTimezone($timezone); } if (self::$use_strptime && function_exists("strptime")) { $str_format = str_replace(array_keys(TimeDate::$format_to_str), array_values(TimeDate::$format_to_str), $format); // for a reason unknown to modern science, %P doesn't work in strptime $str_format = str_replace("%P", "%p", $str_format); // strip spaces before am/pm as our formats don't have them $time = preg_replace('/\\s+(AM|PM)/i', '\\1', $time); // TODO: better way to not risk locale stuff problems? $data = strptime($time, $str_format); if (empty($data)) { $GLOBALS['log']->error("Cannot parse {$time} for format {$format}"); return null; } if ($data["tm_year"] == 0) { unset($data["tm_year"]); } if ($data["tm_mday"] == 0) { unset($data["tm_mday"]); } if (isset($data["tm_year"])) { $data["tm_year"] += 1900; } if (isset($data["tm_mon"])) { $data["tm_mon"]++; } $data += self::$data_init; // fill in missing parts } else { // Windows, etc. might not have strptime - we'd have to work harder here $data = $res->_strptime($time, $format); } if (empty($data)) { $GLOBALS['log']->error("Cannot parse {$time} for format {$format}"); return null; } if (isset($data["tm_year"])) { $res->setDate($data["tm_year"], $data["tm_mon"], $data["tm_mday"]); } $res->setTime($data["tm_hour"], $data["tm_min"], $data["tm_sec"]); return $res; }