/** * Cast a string value into a qCal_DateTime_Period object */ protected function doCast($value) { $parts = explode("/", $value); if (count($parts) !== 2) { throw new qCal_DateTime_Exception_InvalidPeriod("A period must contain a start date and either an end date, or a duration of time."); } $start = qCal_DateTime::factory($parts[0]); try { $end = qCal_DateTime::factory($parts[1]); } catch (qCal_DateTime_Exception $e) { // @todo This should probably be a more specific exception // invalid date, so try duration // @todo: I might want to create a qCal_Date object to represent a duration (not tied to any points in time) // using a qCal_Value object here is sort of inconsistent. Plus, I can see value in having that functionality // within the qCal_Date subcomponent // also, there is a difference in a period and a duration in that if you say start on feb 26 and end on march 2 // that will be a different "duration" depending on the year. that goes for months with alternate amounts of days too $duration = qCal_DateTime_Duration::factory($parts[1]); $end = qCal_DateTime::factory($start->getUnixTimestamp() + $duration->getSeconds()); // @todo This needs to be updated once qCal_DateTime accepts timestamps } return new qCal_DateTime_Period($start, $end); }
/** * Test that duration data is handled right */ public function testRawDuration() { $value = new qCal_Value_Duration('P1W3DT2H3M45S'); $this->assertEqual($value->getValue(), qCal_DateTime_Duration::factory('P1W3DT2H3M45S')); // this is how many seconds are in the duration }
/** * Convert to internal representation */ protected function doCast($value) { return qCal_DateTime_Duration::factory($value); }