/**
  * Try to parse a date interval specification string.
  *
  * @param string|DateInterval|PHPDateInterval|null $dateIntervalSpec [optional] A date interval specification, a
  *     relative date and time string, a DateInterval or PHPDateInterval instance or null to create a zero
  *     configuration.
  * @param mixed|null $default [optional] The default value returned on failure.
  *
  * @return string|mixed The parsed date interval specification or the default value on failure.
  */
 public static function parse($dateIntervalSpec = null, $default = null)
 {
     // Return a zero specification if the specification is set to null
     if (empty($dateIntervalSpec)) {
         return DateIntervalSpec::createZero();
     }
     // Parse strings
     if (is_string($dateIntervalSpec)) {
         // Check whether the string is already a valid specification
         if (static::isValid($dateIntervalSpec)) {
             return $dateIntervalSpec;
         }
         // Check whether the string has relative keywords
         if (DateTime::hasRelativeKeywords($dateIntervalSpec)) {
             try {
                 // Try to parse the string as relative date and time
                 $dateInterval = DateInterval::createFromDateString($dateIntervalSpec);
                 // Get and return the date interval specification
                 return $dateInterval->toSpecString();
             } catch (Exception $ex) {
             }
         }
     }
     // Parse DateInterval objects
     if ($dateIntervalSpec instanceof DateInterval) {
         return $dateIntervalSpec->toSpecString();
     }
     // Parse PHPDateInterval objects
     if ($dateIntervalSpec instanceof PHPDateInterval) {
         if (($spec = DateIntervalSpec::create($dateIntervalSpec->y, $dateIntervalSpec->m, null, $dateIntervalSpec->d, $dateIntervalSpec->h, $dateIntervalSpec->i, $dateIntervalSpec->s)) !== null) {
             return $spec;
         }
     }
     // Couldn't parse the string, return the default value
     return $default;
 }
 /**
  * Get the difference in hours using a filter closure
  *
  * @param Closure $callback The callback function to call for each hour as filter.
  * @param DateTime|PHPDateTime|string|null $dateTime [optional] A DateTime or PHPDateTime instance, the date and
  *     time as a string or null to use the now() date and time.
  * @param boolean $absolute Get the absolute of the difference.
  *
  * @return int|null The difference in hours. Null will be returned on failure.
  */
 public function diffInHoursFiltered(Closure $callback, $dateTime = null, $absolute = true)
 {
     return $this->diffFiltered(DateInterval::createHour(), $callback, $dateTime, $absolute);
 }
 /**
  * Formats the date interval into a string.
  *
  * @param string|null $format [optional] The format to use specified by PHPDateInterval::diff();, or null to return
  *     the date interval specification.
  *
  * @return string The formatted date interval.
  *
  * @link http://php.net/manual/en/dateinterval.format.php
  */
 public function format($format = null)
 {
     // Return the specification if the parameter is null
     if ($format === null) {
         return $this->toSpecString();
     }
     // Get and return the date interval in proper format
     return parent::format($format);
 }
 /**
  * Parse a date interval. A new instance may be created.
  *
  * This method allows better fluent syntax because it makes method chaining possible.
  *
  * @param DateInterval|PHPDateInterval|string|null $dateInterval [optional] A DateInterval or PHPDateInterval
  *     instance, a date interval specification, or null to use a zero specification.
  * @param mixed|null $default [optional] The default value to be returned on failure.
  *
  * @return static|mixed A DateInterval instance, or the default value on failure.
  */
 public static function parse($dateInterval, $default = null)
 {
     return ($result = DateInterval::parse($dateInterval)) === null ? $default : $result;
 }