/** * AgaviTimeZone API. * * @see AgaviTimeZone::getOffsetRef() * * @author Dominik del Bondio <*****@*****.**> * @author The ICU Project * @since 0.11.0 */ public function getOffsetRef($date, $local, &$rawoff, &$dstoff) { // The check against finalMillis will suffice most of the time, except // for the case in which finalMillis == DBL_MAX, date == DBL_MAX, // and finalZone == 0. For this case we add "&& finalZone != 0". if ($date >= $this->finalMillis && $this->finalZone !== null) { $millis = 0; $days = AgaviToolkit::floorDivide($date, AgaviDateDefinitions::MILLIS_PER_DAY, $millis); $year = 0; $month = 0; $dom = 0; $dow = 0; AgaviCalendarGrego::dayToFields($days, $year, $month, $dom, $dow); $rawoff = $this->finalZone->getRawOffset(); if (!$local) { // Adjust from GMT to local $date += $rawoff; $days2 = AgaviToolkit::floorDivide($date, AgaviDateDefinitions::MILLIS_PER_DAY, $millis); if ($days2 != $days) { AgaviCalendarGrego::dayToFields($days2, $year, $month, $dom, $dow); } } $dstoff = $this->finalZone->getOffset(AgaviGregorianCalendar::AD, $year, $month, $dom, $dow, $millis) - $rawoff; return; } $secs = floor($date / AgaviDateDefinitions::MILLIS_PER_SECOND); $transition = $this->findTransition($secs, $local); $rawoff = $this->types[$transition['type']]['rawOffset'] * AgaviDateDefinitions::MILLIS_PER_SECOND; $dstoff = $this->types[$transition['type']]['dstOffset'] * AgaviDateDefinitions::MILLIS_PER_SECOND; }
/** * @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); }