/** * Create a new instance of a number of weeks * * @param float $aNumber * @return object Duration * @access public * @since 5/13/05 * @static */ static function withWeeks($aNumber) { $obj = Duration::withDaysHoursMinutesSeconds($aNumber * 7, 0, 0, 0); return $obj; }
/** * Test converting methods * */ function test_converting() { $time = Time::withHourMinuteSecond(15, 25, 10); // asDate () $temp = $time->asDate(); $this->assertTrue($temp->isEqualTo(Date::today())); $this->assertEqual(strtolower(get_class($temp)), 'date'); // asDateAndTime () $temp = $time->asDateAndTime(); $comparison = DateAndTime::midnight(); $comparison = $comparison->plus(Duration::withSeconds(55510)); $this->assertTrue($temp->isEqualTo($comparison)); $this->assertEqual(strtolower(get_class($temp)), 'dateandtime'); // asDuration () $temp = $time->asDuration(); $this->assertTrue($temp->isEqualTo(Duration::withSeconds(55510))); $this->assertEqual(strtolower(get_class($temp)), 'duration'); // asMonth () $temp = $time->asMonth(); $this->assertTrue($temp->isEqualTo(Month::starting(Date::today()))); $this->assertEqual(strtolower(get_class($temp)), 'month'); // asSeconds () $this->assertEqual($time->asSeconds(), 55510); // asTime () $temp = $time->asTime(); $this->assertTrue($temp->isEqualTo($time)); $this->assertEqual(strtolower(get_class($temp)), 'time'); // asTimeStamp () $temp = $time->asTimeStamp(); $comparison = TimeStamp::midnight(); $comparison = $comparison->plus(Duration::withSeconds(55510)); $this->assertTrue($temp->isEqualTo($comparison)); $this->assertEqual(strtolower(get_class($temp)), 'timestamp'); // asWeek () $temp = $time->asWeek(); $this->assertTrue($temp->isEqualTo(Week::starting(Date::today()))); $this->assertEqual(strtolower(get_class($temp)), 'week'); // asYear () $temp = $time->asYear(); $this->assertTrue($temp->isEqualTo(Year::starting(Date::today()))); $this->assertEqual(strtolower(get_class($temp)), 'year'); // to () $today = DateAndTime::today(); $tomorrow = DateAndTime::tomorrow(); $result = $time->to($tomorrow); $this->assertEqual(strtolower(get_class($result)), 'timespan'); $this->assertTrue($result->isEqualTo(Timespan::startingDuration($today->plus(Duration::withSeconds(55510)), Duration::withDaysHoursMinutesSeconds(0, 8, 34, 50)))); $result = $time->to(Time::withHourMinuteSecond(23, 25, 10)); $this->assertEqual(strtolower(get_class($result)), 'timespan'); $this->assertTrue($result->isEqualTo(Timespan::startingDuration($today->plus(Duration::withSeconds(55510)), Duration::withDaysHoursMinutesSeconds(0, 8, 0, 0)))); }
/** * Create a new instance. * * @param integer $anIntYear * @param integer $anIntOrStringMonth * @param integer $anIntDay * @param integer $anIntHour * @param integer $anIntMinute * @param integer $anIntSecond * @param object Duration $aDurationOffset * @param optional string $class DO NOT USE OUTSIDE OF PACKAGE. * This parameter is used to get around the limitations of not being * able to find the class of the object that recieved the initial * method call. * @return object DateAndTime * @access public * @static * @since 5/4/05 */ static function withYearMonthDayHourMinuteSecondOffset($anIntYear, $anIntOrStringMonth, $anIntDay, $anIntHour, $anIntMinute, $anIntSecond, $aDurationOffset, $class = 'DateAndTime') { // Validate our passed class name. if (!(strtolower($class) == strtolower('DateAndTime') || is_subclass_of(new $class(), 'DateAndTime'))) { die("Class, '{$class}', is not a subclass of 'DateAndTime'."); } // Ensure that we have no days less than 1. if ($anIntDay < 1) { $anIntDay = 1; } if (is_numeric($anIntOrStringMonth)) { $monthIndex = $anIntOrStringMonth; } else { $monthIndex = Month::indexOfMonth($anIntOrStringMonth); } $p = intval(($monthIndex - 14) / 12); $q = $anIntYear + 4800 + $p; $r = $monthIndex - 2 - 12 * $p; $s = intval(($anIntYear + 4900 + $p) / 100); $julianDayNumber = intval(1461 * $q / 4) + intval(367 * $r / 12) - intval(3 * $s / 4) + ($anIntDay - 32075); $since = Duration::withDaysHoursMinutesSeconds($julianDayNumber, $anIntHour, $anIntMinute, $anIntSecond); if (is_null($aDurationOffset)) { $offset = DateAndTime::localOffset(); } else { $offset = $aDurationOffset; } $dateAndTime = new $class(); $dateAndTime->ticksOffset($since->ticks(), $offset); return $dateAndTime; }
/** * Test durations that generate seconds larger than 2^32 seconds. * This may or may not work on some systems. * (32-bit) integers can be up to ~2billion. * This corresponds to ~100 years (36500 days). * The system may or may not support going over this limit. * The system this was developed on, * * Linux version 2.4.18-14 (bhcompile@stripples.devel.redhat.com) * (gcc version 3.2 20020903 (Red Hat Linux 8.0 3.2-7)) #1 * Wed Sep 4 13:35:50 EDT 2002 * * PHP 4.3.2 * './configure' '--with-apxs2=/usr/local/apache2/bin/apxs' * '--enable-safe-mode' '--with-openssl' '--with-gd' * '--enable-gd-native-ttf' '--with-jpeg-dir=/usr/lib' * '--with-png-dir=/usr/lib' '--with-xpm-dir=/usr/lib' * '--with-ttf=/usr/lib' '--with-t1lib=/usr/lib' '--with-ldap' * '--with-mysql' '--with-pdflib' '--with-zlib-dir=/usr/lib' * '--with-gettext' '--with-xml' '--with-pgsql=/usr' * '--with-java=/usr/java' '--with-iconv=/usr/local/lib' '--with-dom' * * supports the following tests. */ function test_big_durations() { // 50 years (18250 days) $duration = Duration::withDays(18250); $this->assertEqual($duration->days(), 18250); $this->assertEqual($duration->hours(), 0); $this->assertEqual($duration->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($duration->asSeconds(), 86400 * 18250); $this->assertEqual($duration->asSeconds(), 1576800000); // 100 years (36500 days) $duration = Duration::withDays(36500); $this->assertEqual($duration->days(), 36500); $this->assertEqual($duration->hours(), 0); $this->assertEqual($duration->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($duration->asSeconds(), 86400 * 36500); $this->assertEqual($duration->asSeconds(), 3153600000); // 500 years (182500 days) $duration = Duration::withDays(182500); $this->assertEqual($duration->days(), 182500); $this->assertEqual($duration->hours(), 0); $this->assertEqual($duration->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($duration->asSeconds(), 86400 * 182500); $this->assertEqual($duration->asSeconds(), 15768000000); // 5000 years (1825000 days) $duration = Duration::withDays(1825000); $this->assertEqual($duration->days(), 1825000); $this->assertEqual($duration->hours(), 0); $this->assertEqual($duration->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($duration->asSeconds(), 86400 * 1825000); $this->assertEqual($duration->asSeconds(), 157680000000); // 5000 years (1825000 days) // minus 500 years (182500 days) // should equal 4500 years (1642500 days) $duration = Duration::withDays(1825000); $result = $duration->minus(Duration::withDays(182500)); $this->assertEqual($result->days(), 1642500); $this->assertEqual($result->hours(), 0); $this->assertEqual($result->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($result->asSeconds(), 86400 * 1642500); $this->assertEqual($result->asSeconds(), 141912000000); // 500,000,000 years (182500000000 days) // minus 500 years (182500 days) // should equal 499,999,500 years (182481750000 days) $duration = Duration::withDays(182500000000); $result = $duration->minus(Duration::withDays(182500)); $this->assertEqual($result->days(), 182499817500); $this->assertEqual($result->hours(), 0); $this->assertEqual($result->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($result->asSeconds(), 86400 * 182499817500); $this->assertEqual($result->asSeconds(), hexdec('3804e5eaf8ea00')); // 50,000,000,000 years (18250000000000 days) // minus 500 years (182500 days) // should equal 49,999,999,500 years (18249999817500 days) $duration = Duration::withDays(18250000000000); $result = $duration->minus(Duration::withDays(182500)); $this->assertEqual($result->days(), 18249999817500); $this->assertEqual($result->hours(), 0); $this->assertEqual($result->minutes(), 0); $this->assertEqual($duration->seconds(), 0); $this->assertEqual($result->asSeconds(), 86400 * 18249999817500); $this->assertEqual($result->asSeconds(), hexdec('15e1eb3b3dfd6a00')); // Beyond negative 4 billion years, the precision drops from // second precision to hour precision. // 4,000,000,000 years (1460000000000 days) $duration = Duration::withDaysHoursMinutesSeconds(1460000000000, 2, 23, 12); $this->assertEqual($duration->days(), 1460000000000); $this->assertEqual($duration->hours(), 2); $this->assertEqual($duration->minutes(), 23); $this->assertEqual($duration->seconds(), 12); // 50,000,000,000 years (18250000000000 days) $duration = Duration::withDaysHoursMinutesSeconds(18250000000000, 2, 23, 12); $this->assertEqual($duration->days(), 18250000000000); $this->assertEqual($duration->hours(), 2); // $this->assertEqual($duration->minutes(), 23); // $this->assertEqual($duration->seconds(), 12); }