/**
  * Parse the input string and set our elements based on the contents of the
  * input string. Elements not found in the string will be null.
  * 
  * @return void
  * @access private
  * @since 5/24/05
  */
 function parse()
 {
     preg_match(self::getRegex(), $this->input, $timeMatches);
     $timeComponent = $timeMatches[0];
     // The date is anything before the time
     $dateComponent = trim(str_replace($timeComponent, '', $this->input));
     $timeParser = new ISO8601TimeStringParser($timeComponent);
     $dateParser = StringParser::getParserFor($dateComponent);
     // Merge the two results into our fields
     if ($dateParser) {
         $this->setYear($dateParser->year());
         $this->setMonth($dateParser->month());
         $this->setDay($dateParser->day());
     }
     $this->setHour($timeParser->hour());
     $this->setMinute($timeParser->minute());
     $this->setSecond($timeParser->second());
     if (!is_null($timeParser->offsetHour())) {
         $this->setOffsetHour($timeParser->offsetHour());
     }
     if (!is_null($timeParser->offsetMinute())) {
         $this->setOffsetMinute($timeParser->offsetMinute());
     }
     if (!is_null($timeParser->offsetSecond())) {
         $this->setOffsetSecond($timeParser->offsetSecond());
     }
 }
 /**
  * Test the creation methods.
  */
 function test_full_format()
 {
     $parser = new ISO8601StringParser('2005-05-23T15:25:10-04:00');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 23);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), -4);
     $this->assertEqual($parser->offsetMinute(), 0);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('2005-05-03 15:25:10-04:30');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 3);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), -4);
     $this->assertEqual($parser->offsetMinute(), -30);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('20050523152510-0400');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 23);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), -4);
     $this->assertEqual($parser->offsetMinute(), 0);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('20050523152510');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 23);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('2005-05-03 15:25:10Z');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 3);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), 0);
     $this->assertEqual($parser->offsetMinute(), 0);
     $this->assertEqual($parser->offsetSecond(), 0);
     $parser = new ISO8601StringParser('2006-11-12 18:00:00');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2006);
     $this->assertEqual($parser->month(), 11);
     $this->assertEqual($parser->day(), 12);
     $this->assertEqual($parser->hour(), 18);
     $this->assertEqual($parser->minute(), 0);
     $this->assertEqual($parser->second(), 0);
     $this->assertEqual($parser->offsetHour(), 0);
     $this->assertEqual($parser->offsetMinute(), 0);
     $this->assertEqual($parser->offsetSecond(), 0);
     $parser = new ISO8601StringParser('2005-05-03');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 3);
     $this->assertEqual($parser->hour(), NULL);
     $this->assertEqual($parser->minute(), NULL);
     $this->assertEqual($parser->second(), NULL);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('20050503');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), 3);
     $this->assertEqual($parser->hour(), NULL);
     $this->assertEqual($parser->minute(), NULL);
     $this->assertEqual($parser->second(), NULL);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('2005-05');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), NULL);
     $this->assertEqual($parser->minute(), NULL);
     $this->assertEqual($parser->second(), NULL);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('200505');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), 5);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), NULL);
     $this->assertEqual($parser->minute(), NULL);
     $this->assertEqual($parser->second(), NULL);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601StringParser('2005');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), 2005);
     $this->assertEqual($parser->month(), NULL);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), NULL);
     $this->assertEqual($parser->minute(), NULL);
     $this->assertEqual($parser->second(), NULL);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601TimeStringParser('15:25:10Z');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), NULL);
     $this->assertEqual($parser->month(), NULL);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), 0);
     $this->assertEqual($parser->offsetMinute(), 0);
     $this->assertEqual($parser->offsetSecond(), 0);
     $parser = new ISO8601TimeStringParser('15:25:10');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), NULL);
     $this->assertEqual($parser->month(), NULL);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601TimeStringParser('T152510');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), NULL);
     $this->assertEqual($parser->month(), NULL);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
     $parser = new ISO8601TimeStringParser('T152510.375');
     $this->assertTrue($parser->canHandle());
     $this->assertEqual($parser->year(), NULL);
     $this->assertEqual($parser->month(), NULL);
     $this->assertEqual($parser->day(), NULL);
     $this->assertEqual($parser->hour(), 15);
     $this->assertEqual($parser->minute(), 25);
     $this->assertEqual($parser->second(), 10.375);
     $this->assertEqual($parser->offsetHour(), NULL);
     $this->assertEqual($parser->offsetMinute(), NULL);
     $this->assertEqual($parser->offsetSecond(), NULL);
 }