/**
  * AgaviTimeZone API.
  * 
  * @see        AgaviTimeZone::useDaylightTime()
  *
  * @author     Dominik del Bondio <*****@*****.**>
  * @author     The ICU Project
  * @since      0.11.0
  */
 public function useDaylightTime()
 {
     // If DST was observed in 1942 (for example) but has never been
     // observed from 1943 to the present, most clients will expect
     // this method to return FALSE.  This method determines whether
     // DST is in use in the current year (at any point in the year)
     // and returns TRUE if so.
     $days = floor(AgaviCalendar::getNow() / AgaviDateDefinitions::MILLIS_PER_DAY);
     // epoch days
     $year = 0;
     $month = 0;
     $dom = 0;
     $dow = 0;
     AgaviCalendarGrego::dayToFields($days, $year, $month, $dom, $dow);
     if ($year > $this->finalYear) {
         // [sic] >, not >=; see above
         if ($this->finalZone) {
             return $this->finalZone->useDaylightTime();
         } else {
             return true;
         }
     }
     // Find start of this year, and start of next year
     $start = (int) AgaviCalendarGrego::fieldsToDay($year, 0, 1) * AgaviDateDefinitions::SECONDS_PER_DAY;
     $limit = (int) AgaviCalendarGrego::fieldsToDay($year + 1, 0, 1) * AgaviDateDefinitions::SECONDS_PER_DAY;
     // Return TRUE if DST is observed at any time during the current year.
     for ($i = 0, $transitionCount = count($this->transitions); $i < $transitionCount; ++$i) {
         if ($this->transitions[$i]['time'] >= $limit) {
             break;
         }
         if ($this->transitions[$i]['time'] >= $start && $this->types[$this->transitions[$i]['type']]['dstOffset'] != 0 || $this->transitions[$i]['time'] > $start && $i > 0 && $this->types[$this->transitions[$i - 1]['type']]['dstOffset'] != 0) {
             return true;
         }
     }
     return false;
 }
Example #2
0
 /**
  * @bug 4107276
  */
 public function testDSTSavings()
 {
     // It might be better to find a way to integrate this test into the main TimeZone
     // tests above, but I don't have time to figure out how to do this (or if it's
     // even really a good idea).  Let's consider that a future.  --rtg 1/27/98
     $tz = new AgaviSimpleTimeZone($this->tm, -5 * AgaviDateDefinitions::MILLIS_PER_HOUR, "dstSavingsTest", AgaviDateDefinitions::MARCH, 1, 0, 0, AgaviDateDefinitions::SEPTEMBER, 1, 0, 0, 0.5 * AgaviDateDefinitions::MILLIS_PER_HOUR);
     $this->assertEquals(-5 * AgaviDateDefinitions::MILLIS_PER_HOUR, $tz->getRawOffset());
     $this->assertTrue($tz->useDaylightTime(), 'Test time zone should use DST but claims it doesn\'t.');
     $this->assertEquals(0.5 * AgaviDateDefinitions::MILLIS_PER_HOUR, $tz->getDSTSavings());
     $offset = $tz->getOffset(AgaviGregorianCalendar::AD, 1998, AgaviDateDefinitions::JANUARY, 1, AgaviDateDefinitions::THURSDAY, 10 * AgaviDateDefinitions::MILLIS_PER_HOUR);
     $this->assertEquals(-5 * AgaviDateDefinitions::MILLIS_PER_HOUR, $offset);
     $offset = $tz->getOffset(AgaviGregorianCalendar::AD, 1998, AgaviDateDefinitions::JUNE, 1, AgaviDateDefinitions::MONDAY, 10 * AgaviDateDefinitions::MILLIS_PER_HOUR);
     $this->assertEquals(-4.5 * AgaviDateDefinitions::MILLIS_PER_HOUR, $offset);
     $tz->setDSTSavings(AgaviDateDefinitions::MILLIS_PER_HOUR);
     $offset = $tz->getOffset(AgaviGregorianCalendar::AD, 1998, AgaviDateDefinitions::JANUARY, 1, AgaviDateDefinitions::THURSDAY, 10 * AgaviDateDefinitions::MILLIS_PER_HOUR);
     $this->assertEquals(-5 * AgaviDateDefinitions::MILLIS_PER_HOUR, $offset);
     $offset = $tz->getOffset(AgaviGregorianCalendar::AD, 1998, AgaviDateDefinitions::JUNE, 1, AgaviDateDefinitions::MONDAY, 10 * AgaviDateDefinitions::MILLIS_PER_HOUR);
     $this->assertEquals(-4 * AgaviDateDefinitions::MILLIS_PER_HOUR, $offset);
 }