$value) { if (!isset($keys[$key])) { throw new Exception( pht( 'Unexpected key "%s" in duration dictionary, expected keys: %s.', $key, implode(', ', array_keys($keys)))); } } $duration = id(new self()) ->setIsNegative(idx($dict, 'isNegative', false)) ->setWeeks(idx($dict, 'weeks', 0)) ->setDays(idx($dict, 'days', 0)) ->setHours(idx($dict, 'hours', 0)) ->setMinutes(idx($dict, 'minutes', 0)) ->setSeconds(idx($dict, 'seconds', 0)); return $duration; } public function toDictionary() { return array( 'isNegative' => $this->getIsNegative(), 'weeks' => $this->getWeeks(), 'days' => $this->getDays(), 'hours' => $this->getHours(), 'minutes' => $this->getMinutes(), 'seconds' => $this->getSeconds(), ); } public static function newFromISO8601($value) { $pattern = '/^'. '(?P[+-])?'. 'P'. '(?:'. '(?P\d+)W'. '|'. '(?:(?:(?P\d+)D)?'. '(?:T(?:(?P\d+)H)?(?:(?P\d+)M)?(?:(?P\d+)S)?)?'. ')'. ')'. '\z/'; $matches = null; $ok = preg_match($pattern, $value, $matches); if (!$ok) { throw new Exception( pht( 'Expected ISO8601 duration in the format "P12DT3H4M5S", found '. '"%s".', $value)); } $is_negative = (idx($matches, 'sign') == '-'); return id(new self()) ->setIsNegative($is_negative) ->setWeeks((int)idx($matches, 'W', 0)) ->setDays((int)idx($matches, 'D', 0)) ->setHours((int)idx($matches, 'H', 0)) ->setMinutes((int)idx($matches, 'M', 0)) ->setSeconds((int)idx($matches, 'S', 0)); } public function toISO8601() { $parts = array(); $parts[] = 'P'; $weeks = $this->getWeeks(); if ($weeks) { $parts[] = $weeks.'W'; } else { $days = $this->getDays(); if ($days) { $parts[] = $days.'D'; } $parts[] = 'T'; $hours = $this->getHours(); if ($hours) { $parts[] = $hours.'H'; } $minutes = $this->getMinutes(); if ($minutes) { $parts[] = $minutes.'M'; } $seconds = $this->getSeconds(); if ($seconds) { $parts[] = $seconds.'S'; } } return implode('', $parts); } public function setIsNegative($is_negative) { $this->isNegative = $is_negative; return $this; } public function getIsNegative() { return $this->isNegative; } public function setWeeks($weeks) { $this->weeks = $weeks; return $this; } public function getWeeks() { return $this->weeks; } public function setDays($days) { $this->days = $days; return $this; } public function getDays() { return $this->days; } public function setHours($hours) { $this->hours = $hours; return $this; } public function getHours() { return $this->hours; } public function setMinutes($minutes) { $this->minutes = $minutes; return $this; } public function getMinutes() { return $this->minutes; } public function setSeconds($seconds) { $this->seconds = $seconds; return $this; } public function getSeconds() { return $this->seconds; } }