public function addTo(Temporal $temporal, $amount) { switch ($this) { case IsoFields::WEEK_BASED_YEARS(): return $temporal->with(IsoFields::WEEK_BASED_YEAR(), Math::addExact($temporal->get(IsoFields::WEEK_BASED_YEAR()), $amount)); case IsoFields::QUARTER_YEARS(): // no overflow (256 is multiple of 4) return $temporal->plus($amount / 256, ChronoUnit::YEARS())->plus($amount % 256 * 3, ChronoUnit::MONTHS()); default: throw new IllegalStateException("Unreachable"); } }
function provider_factory_of_badTemporalUnit() { return [[0, CU::MICROS()], [0, CU::MILLIS()], [0, CU::MINUTES()], [0, CU::HOURS()], [0, CU::HALF_DAYS()], [0, CU::DAYS()], [0, CU::MONTHS()], [0, CU::YEARS()], [0, CU::DECADES()], [0, CU::CENTURIES()], [0, CU::MILLENNIA()]]; }
/** * Calculates the amount of time until another year in terms of the specified unit. * <p> * This calculates the amount of time between two {@code Year} * objects in terms of a single {@code TemporalUnit}. * The start and end points are {@code this} and the specified year. * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method is converted to a * {@code Year} using {@link #from(TemporalAccessor)}. * For example, the amount in decades between two year can be calculated * using {@code startYear.until(endYear, DECADES)}. * <p> * The calculation returns a whole number, representing the number of * complete units between the two years. * For example, the amount in decades between 2012 and 2031 * will only be one decade as it is one year short of two decades. * <p> * There are two equivalent ways of using this method. * The first is to invoke this method. * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: * <pre> * // these two lines are equivalent * amount = start.until(end, YEARS); * amount = YEARS.between(start, end); * </pre> * The choice should be made based on which makes the code more readable. * <p> * The calculation is implemented in this method for {@link ChronoUnit}. * The units {@code YEARS}, {@code DECADES}, {@code CENTURIES}, * {@code MILLENNIA} and {@code ERAS} are supported. * Other {@code ChronoUnit} values will throw an exception. * <p> * If the unit is not a {@code ChronoUnit}, then the result of this method * is obtained by invoking {@code TemporalUnit.between(Temporal, Temporal)} * passing {@code this} as the first argument and the converted input temporal * as the second argument. * <p> * This instance is immutable and unaffected by this method call. * * @param Temporal $endExclusive the end date, exclusive, which is converted to a {@code Year}, not null * @param TemporalUnit $unit the unit to measure the amount in, not null * @return int the amount of time between this year and the end year * @throws DateTimeException if the amount cannot be calculated, or the end * temporal cannot be converted to a {@code Year} * @throws UnsupportedTemporalTypeException if the unit is not supported * @throws ArithmeticException if numeric overflow occurs */ public function until(Temporal $endExclusive, TemporalUnit $unit) { $end = Year::from($endExclusive); if ($unit instanceof ChronoUnit) { $yearsUntil = $end->year - $this->year; // no overflow switch ($unit) { case ChronoUnit::YEARS(): return $yearsUntil; case ChronoUnit::DECADES(): return Math::div($yearsUntil, 10); case ChronoUnit::CENTURIES(): return Math::div($yearsUntil, 100); case ChronoUnit::MILLENNIA(): return Math::div($yearsUntil, 1000); case ChronoUnit::ERAS(): return $end->getLong(ChronoField::ERA()) - $this->getLong(ChronoField::ERA()); } throw new UnsupportedTemporalTypeException("Unsupported unit: " . $unit); } return $unit->between($this, $end); }
public function test_isSupported_TemporalUnit() { //$this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isSupported((TemporalUnit) null), false); TODO $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::NANOS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::MICROS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::MILLIS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::SECONDS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::MINUTES()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::HOURS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::HALF_DAYS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::DAYS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::WEEKS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::MONTHS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::YEARS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::DECADES()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::CENTURIES()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::MILLENNIA()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::ERAS()), true); $this->assertEquals(self::TEST_2008_6_30_11_30_59_000000500()->isUnitSupported(CU::FOREVER()), false); }
function data_fieldUnit() { return [[CF::YEAR(), CU::YEARS(), CU::FOREVER()], [CF::MONTH_OF_YEAR(), CU::MONTHS(), CU::YEARS()], [CF::DAY_OF_MONTH(), CU::DAYS(), CU::MONTHS()], [CF::DAY_OF_WEEK(), CU::DAYS(), CU::WEEKS()], [CF::DAY_OF_YEAR(), CU::DAYS(), CU::YEARS()], [CF::HOUR_OF_DAY(), CU::HOURS(), CU::DAYS()], [CF::MINUTE_OF_DAY(), CU::MINUTES(), CU::DAYS()], [CF::MINUTE_OF_HOUR(), CU::MINUTES(), CU::HOURS()], [CF::SECOND_OF_DAY(), CU::SECONDS(), CU::DAYS()], [CF::SECOND_OF_MINUTE(), CU::SECONDS(), CU::MINUTES()], [CF::MILLI_OF_DAY(), CU::MILLIS(), CU::DAYS()], [CF::MILLI_OF_SECOND(), CU::MILLIS(), CU::SECONDS()], [CF::MICRO_OF_SECOND(), CU::MICROS(), CU::SECONDS()], [CF::MICRO_OF_DAY(), CU::MICROS(), CU::DAYS()], [CF::NANO_OF_SECOND(), CU::NANOS(), CU::SECONDS()], [CF::NANO_OF_DAY(), CU::NANOS(), CU::DAYS()]]; }
/** * Calculates the amount of time until another date in terms of the specified unit. * <p> * This calculates the amount of time between two {@code LocalDate} * objects in terms of a single {@code TemporalUnit}. * The start and end points are {@code this} and the specified date. * The result will be negative if the end is before the start. * The {@code Temporal} passed to this method is converted to a * {@code LocalDate} using {@link #from(TemporalAccessor)}. * For example, the amount in days between two dates can be calculated * using {@code startDate.until(endDate, DAYS)}. * <p> * The calculation returns a whole number, representing the number of * complete units between the two dates. * For example, the amount in months between 2012-06-15 and 2012-08-14 * will only be one month as it is one day short of two months. * <p> * There are two equivalent ways of using this method. * The first is to invoke this method. * The second is to use {@link TemporalUnit#between(Temporal, Temporal)}: * <pre> * // these two lines are equivalent * amount = start.until(end, MONTHS); * amount = MONTHS.between(start, end); * </pre> * The choice should be made based on which makes the code more readable. * <p> * The calculation is implemented in this method for {@link ChronoUnit}. * The units {@code DAYS}, {@code WEEKS}, {@code MONTHS}, {@code YEARS}, * {@code DECADES}, {@code CENTURIES}, {@code MILLENNIA} and {@code ERAS} * are supported. Other {@code ChronoUnit} values will throw an exception. * <p> * If the unit is not a {@code ChronoUnit}, then the result of this method * is obtained by invoking {@code TemporalUnit.between(Temporal, Temporal)} * passing {@code this} as the first argument and the converted input temporal * as the second argument. * <p> * This instance is immutable and unaffected by this method call. * * @param Temporal $endExclusive the end date, exclusive, which is converted to a {@code LocalDate}, not null * @param TemporalUnit $unit the unit to measure the amount in, not null * @return int the amount of time between this date and the end date * @throws DateTimeException if the amount cannot be calculated, or the end * temporal cannot be converted to a {@code LocalDate} * @throws UnsupportedTemporalTypeException if the unit is not supported * @throws ArithmeticException if numeric overflow occurs */ public function until(Temporal $endExclusive, TemporalUnit $unit) { $end = LocalDate::from($endExclusive); if ($unit instanceof ChronoUnit) { switch ($unit) { case ChronoUnit::DAYS(): return $this->daysUntil($end); case ChronoUnit::WEEKS(): return Math::div($this->daysUntil($end), 7); case ChronoUnit::MONTHS(): return $this->monthsUntil($end); case ChronoUnit::YEARS(): return Math::div($this->monthsUntil($end), 12); case ChronoUnit::DECADES(): return Math::div($this->monthsUntil($end), 120); case ChronoUnit::CENTURIES(): return Math::div($this->monthsUntil($end), 1200); case ChronoUnit::MILLENNIA(): return Math::div($this->monthsUntil($end), 12000); case ChronoUnit::ERAS(): return $end->getLong(ChronoField::ERA()) - $this->getLong(ChronoField::ERA()); } throw new UnsupportedTemporalTypeException("Unsupported unit: " . $unit); } return $unit->between($this, $end); }
/** * Returns the "first day of next year" adjuster, which returns a new date set to * the first day of the next year. * <p> * The ISO calendar system behaves as follows:<br> * The input 2011-01-15 will return 2012-01-01. * <p> * The behavior is suitable for use with most calendar systems. * It is equivalent to: * <pre> * temporal.adjust(DAY_OF_YEAR, 1).plus(1, YEARS); * </pre> * * @return TemporalAdjuster the first day of next month adjuster, not null */ public static function firstDayOfNextYear() { return self::fromCallable(function (Temporal $temporal) { return $temporal->with(ChronoField::DAY_OF_YEAR(), 1)->plus(1, ChronoUnit::YEARS()); }); }
function data_periodUntilUnit() { return [[$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::DAYS(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::WEEKS(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::MONTHS(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::YEARS(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::DECADES(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::CENTURIES(), 0], [$this->dtNoon(2000, 1, 1), $this->dtNoon(2000, 1, 1), CU::MILLENNIA(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 14), CU::DAYS(), 30], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 15), CU::DAYS(), 31], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 16), CU::DAYS(), 32], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 17), CU::WEEKS(), 4], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 18), CU::WEEKS(), 4], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 19), CU::WEEKS(), 5], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 20), CU::WEEKS(), 5], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 14), CU::MONTHS(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 15), CU::MONTHS(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 2, 16), CU::MONTHS(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 3, 14), CU::MONTHS(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 3, 15), CU::MONTHS(), 2], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2000, 3, 16), CU::MONTHS(), 2], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2001, 1, 14), CU::YEARS(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2001, 1, 15), CU::YEARS(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2001, 1, 16), CU::YEARS(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2004, 1, 14), CU::YEARS(), 3], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2004, 1, 15), CU::YEARS(), 4], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2004, 1, 16), CU::YEARS(), 4], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2010, 1, 14), CU::DECADES(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2010, 1, 15), CU::DECADES(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2100, 1, 14), CU::CENTURIES(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(2100, 1, 15), CU::CENTURIES(), 1], [$this->dtNoon(2000, 1, 15), $this->dtNoon(3000, 1, 14), CU::MILLENNIA(), 0], [$this->dtNoon(2000, 1, 15), $this->dtNoon(3000, 1, 15), CU::MILLENNIA(), 1], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::NANOS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::MICROS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::MILLIS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::SECONDS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::MINUTES(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::HOURS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(0, 0, 0, 0), CU::HALF_DAYS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::NANOS(), 2 * 3600 * 1000000000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::MICROS(), 2 * 3600 * 1000000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::MILLIS(), 2 * 3600 * 1000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::SECONDS(), 2 * 3600], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::MINUTES(), 2 * 60], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::HOURS(), 2], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 0, 0, 0), CU::HALF_DAYS(), 0], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::NANOS(), 14 * 3600 * 1000000000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::MICROS(), 14 * 3600 * 1000000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::MILLIS(), 14 * 3600 * 1000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::SECONDS(), 14 * 3600], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::MINUTES(), 14 * 60], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::HOURS(), 14], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(14, 0, 0, 0), CU::HALF_DAYS(), 1], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::NANOS(), (2 * 3600 + 30 * 60 + 40) * 1000000000 + 1500], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::MICROS(), (2 * 3600 + 30 * 60 + 40) * 1000000 + 1], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::MILLIS(), (2 * 3600 + 30 * 60 + 40) * 1000], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::SECONDS(), 2 * 3600 + 30 * 60 + 40], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::MINUTES(), 2 * 60 + 30], [$this->dtEpoch(0, 0, 0, 0), $this->dtEpoch(2, 30, 40, 1500), CU::HOURS(), 2], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 499), CU::NANOS(), -1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 500), CU::NANOS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 501), CU::NANOS(), 1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 39, 500), CU::SECONDS(), -1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 39, 501), CU::SECONDS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 499), CU::SECONDS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 500), CU::SECONDS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 501), CU::SECONDS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 41, 499), CU::SECONDS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 41, 500), CU::SECONDS(), 1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 499), CU::NANOS(), -1 + 86400000000000], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 500), CU::NANOS(), 0 + 86400000000000], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 501), CU::NANOS(), 1 + 86400000000000], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 39, 499), CU::SECONDS(), -2 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 39, 500), CU::SECONDS(), -1 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 39, 501), CU::SECONDS(), -1 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 499), CU::SECONDS(), -1 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 500), CU::SECONDS(), 0 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 501), CU::SECONDS(), 0 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 41, 499), CU::SECONDS(), 0 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 41, 500), CU::SECONDS(), 1 + 86400], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 29, 40, 499), CU::MINUTES(), -2 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 29, 40, 500), CU::MINUTES(), -1 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 29, 40, 501), CU::MINUTES(), -1 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 499), CU::MINUTES(), -1 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 500), CU::MINUTES(), 0 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 501), CU::MINUTES(), 0 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 31, 40, 499), CU::MINUTES(), 0 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 31, 40, 500), CU::MINUTES(), 1 + 24 * 60], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 11, 30, 40, 499), CU::HOURS(), -2 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 11, 30, 40, 500), CU::HOURS(), -1 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 11, 30, 40, 501), CU::HOURS(), -1 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 499), CU::HOURS(), -1 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 500), CU::HOURS(), 0 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 501), CU::HOURS(), 0 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 13, 30, 40, 499), CU::HOURS(), 0 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 13, 30, 40, 500), CU::HOURS(), 1 + 24], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 13, 12, 30, 40, 499), CU::DAYS(), -2], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 13, 12, 30, 40, 500), CU::DAYS(), -2], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 13, 12, 30, 40, 501), CU::DAYS(), -1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 14, 12, 30, 40, 499), CU::DAYS(), -1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 14, 12, 30, 40, 500), CU::DAYS(), -1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 14, 12, 30, 40, 501), CU::DAYS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 499), CU::DAYS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 500), CU::DAYS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 15, 12, 30, 40, 501), CU::DAYS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 499), CU::DAYS(), 0], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 500), CU::DAYS(), 1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 16, 12, 30, 40, 501), CU::DAYS(), 1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 17, 12, 30, 40, 499), CU::DAYS(), 1], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 17, 12, 30, 40, 500), CU::DAYS(), 2], [$this->dt(2000, 1, 15, 12, 30, 40, 500), $this->dt(2000, 1, 17, 12, 30, 40, 501), CU::DAYS(), 2]]; }
public function provider_reducedWithChrono() { $baseYear = LocalDate::of(2000, 1, 1); return [[IsoChronology::INSTANCE()->dateFrom($baseYear)], [IsoChronology::INSTANCE()->dateFrom($baseYear)->plus(1, ChronoUnit::YEARS())], [IsoChronology::INSTANCE()->dateFrom($baseYear)->plus(99, ChronoUnit::YEARS())], [MinguoChronology::INSTANCE()->dateFrom($baseYear)], [MinguoChronology::INSTANCE()->dateFrom($baseYear)->plus(1, ChronoUnit::YEARS())], [MinguoChronology::INSTANCE()->dateFrom($baseYear)->plus(99, ChronoUnit::YEARS())], [ThaiBuddhistChronology::INSTANCE()->dateFrom($baseYear)], [ThaiBuddhistChronology::INSTANCE()->dateFrom($baseYear)->plus(1, ChronoUnit::YEARS())], [ThaiBuddhistChronology::INSTANCE()->dateFrom($baseYear)->plus(99, ChronoUnit::YEARS())]]; }
public function rangeRefinedBy(TemporalAccessor $temporal) { if ($this->rangeUnit == ChronoUnit::WEEKS()) { // day-of-week return $this->range; } else { if ($this->rangeUnit == ChronoUnit::MONTHS()) { // week-of-month return $this->rangeByWeek($temporal, CF::DAY_OF_MONTH()); } else { if ($this->rangeUnit == ChronoUnit::YEARS()) { // week-of-year return $this->rangeByWeek($temporal, CF::DAY_OF_YEAR()); } else { if ($this->rangeUnit == IsoFields::WEEK_BASED_YEARS()) { return $this->rangeWeekOfWeekBasedYear($temporal); } else { if ($this->rangeUnit == ChronoUnit::FOREVER()) { return CF::YEAR()->range(); } else { throw new IllegalStateException("unreachable, rangeUnit: " . $this->rangeUnit . ", this: " . $this); } } } } } }
/** * @expectedException \Celest\DateTimeException */ public function test_until_invalidType() { $start = Year::of(2010); $start->until(LocalTime::of(11, 30), ChronoUnit::YEARS()); }
function data_truncatedToInvalid() { return [[LocalTime::of(1, 2, 3, 123456789), new NINETY_FIVE_MINS()], [LocalTime::of(1, 2, 3, 123456789), CU::WEEKS()], [LocalTime::of(1, 2, 3, 123456789), CU::MONTHS()], [LocalTime::of(1, 2, 3, 123456789), CU::YEARS()]]; }
function data_badPlusTemporalAmount() { return [[MockSimplePeriod::of(2, CU::YEARS())], [MockSimplePeriod::of(2, CU::MONTHS())]]; }
public function until(Temporal $endExclusive, TemporalUnit $unit) { $end = $this->getChronology()->dateFrom($endExclusive); if ($unit instanceof ChronoUnit) { switch ($unit) { case CU::DAYS(): return $this->daysUntil($end); case CU::WEEKS(): return $this->daysUntil($end) / 7; case CU::MONTHS(): return $this->monthsUntil($end); case CU::YEARS(): return $this->monthsUntil($end) / 12; case CU::DECADES(): return $this->monthsUntil($end) / 120; case CU::CENTURIES(): return $this->monthsUntil($end) / 1200; case CU::MILLENNIA(): return $this->monthsUntil($end) / 12000; case CU::ERAS(): return $end->getLong(CF::ERA()) - $this->getLong(CF::ERA()); } throw new UnsupportedTemporalTypeException("Unsupported unit: " . $unit); } return $unit->between($this, $end); }
public function getRangeUnit() { return ChronoUnit::YEARS(); }
function data_periodUntilUnit() { return [[$this->ym(2000, 1), $this->ym(-1, 12), CU::MONTHS(), -2000 * 12 - 1], [$this->ym(2000, 1), $this->ym(0, 1), CU::MONTHS(), -2000 * 12], [$this->ym(2000, 1), $this->ym(0, 12), CU::MONTHS(), -1999 * 12 - 1], [$this->ym(2000, 1), $this->ym(1, 1), CU::MONTHS(), -1999 * 12], [$this->ym(2000, 1), $this->ym(1999, 12), CU::MONTHS(), -1], [$this->ym(2000, 1), $this->ym(2000, 1), CU::MONTHS(), 0], [$this->ym(2000, 1), $this->ym(2000, 2), CU::MONTHS(), 1], [$this->ym(2000, 1), $this->ym(2000, 3), CU::MONTHS(), 2], [$this->ym(2000, 1), $this->ym(2000, 12), CU::MONTHS(), 11], [$this->ym(2000, 1), $this->ym(2001, 1), CU::MONTHS(), 12], [$this->ym(2000, 1), $this->ym(2246, 5), CU::MONTHS(), 246 * 12 + 4], [$this->ym(2000, 1), $this->ym(-1, 12), CU::YEARS(), -2000], [$this->ym(2000, 1), $this->ym(0, 1), CU::YEARS(), -2000], [$this->ym(2000, 1), $this->ym(0, 12), CU::YEARS(), -1999], [$this->ym(2000, 1), $this->ym(1, 1), CU::YEARS(), -1999], [$this->ym(2000, 1), $this->ym(1998, 12), CU::YEARS(), -1], [$this->ym(2000, 1), $this->ym(1999, 1), CU::YEARS(), -1], [$this->ym(2000, 1), $this->ym(1999, 2), CU::YEARS(), 0], [$this->ym(2000, 1), $this->ym(1999, 12), CU::YEARS(), 0], [$this->ym(2000, 1), $this->ym(2000, 1), CU::YEARS(), 0], [$this->ym(2000, 1), $this->ym(2000, 2), CU::YEARS(), 0], [$this->ym(2000, 1), $this->ym(2000, 12), CU::YEARS(), 0], [$this->ym(2000, 1), $this->ym(2001, 1), CU::YEARS(), 1], [$this->ym(2000, 1), $this->ym(2246, 5), CU::YEARS(), 246], [$this->ym(2000, 5), $this->ym(-1, 5), CU::DECADES(), -200], [$this->ym(2000, 5), $this->ym(0, 4), CU::DECADES(), -200], [$this->ym(2000, 5), $this->ym(0, 5), CU::DECADES(), -200], [$this->ym(2000, 5), $this->ym(0, 6), CU::DECADES(), -199], [$this->ym(2000, 5), $this->ym(1, 5), CU::DECADES(), -199], [$this->ym(2000, 5), $this->ym(1990, 4), CU::DECADES(), -1], [$this->ym(2000, 5), $this->ym(1990, 5), CU::DECADES(), -1], [$this->ym(2000, 5), $this->ym(1990, 6), CU::DECADES(), 0], [$this->ym(2000, 5), $this->ym(2000, 4), CU::DECADES(), 0], [$this->ym(2000, 5), $this->ym(2000, 5), CU::DECADES(), 0], [$this->ym(2000, 5), $this->ym(2000, 6), CU::DECADES(), 0], [$this->ym(2000, 5), $this->ym(2010, 4), CU::DECADES(), 0], [$this->ym(2000, 5), $this->ym(2010, 5), CU::DECADES(), 1], [$this->ym(2000, 5), $this->ym(2010, 6), CU::DECADES(), 1], [$this->ym(2000, 5), $this->ym(-1, 5), CU::CENTURIES(), -20], [$this->ym(2000, 5), $this->ym(0, 4), CU::CENTURIES(), -20], [$this->ym(2000, 5), $this->ym(0, 5), CU::CENTURIES(), -20], [$this->ym(2000, 5), $this->ym(0, 6), CU::CENTURIES(), -19], [$this->ym(2000, 5), $this->ym(1, 5), CU::CENTURIES(), -19], [$this->ym(2000, 5), $this->ym(1900, 4), CU::CENTURIES(), -1], [$this->ym(2000, 5), $this->ym(1900, 5), CU::CENTURIES(), -1], [$this->ym(2000, 5), $this->ym(1900, 6), CU::CENTURIES(), 0], [$this->ym(2000, 5), $this->ym(2000, 4), CU::CENTURIES(), 0], [$this->ym(2000, 5), $this->ym(2000, 5), CU::CENTURIES(), 0], [$this->ym(2000, 5), $this->ym(2000, 6), CU::CENTURIES(), 0], [$this->ym(2000, 5), $this->ym(2100, 4), CU::CENTURIES(), 0], [$this->ym(2000, 5), $this->ym(2100, 5), CU::CENTURIES(), 1], [$this->ym(2000, 5), $this->ym(2100, 6), CU::CENTURIES(), 1], [$this->ym(2000, 5), $this->ym(-1, 5), CU::MILLENNIA(), -2], [$this->ym(2000, 5), $this->ym(0, 4), CU::MILLENNIA(), -2], [$this->ym(2000, 5), $this->ym(0, 5), CU::MILLENNIA(), -2], [$this->ym(2000, 5), $this->ym(0, 6), CU::MILLENNIA(), -1], [$this->ym(2000, 5), $this->ym(1, 5), CU::MILLENNIA(), -1], [$this->ym(2000, 5), $this->ym(1000, 4), CU::MILLENNIA(), -1], [$this->ym(2000, 5), $this->ym(1000, 5), CU::MILLENNIA(), -1], [$this->ym(2000, 5), $this->ym(1000, 6), CU::MILLENNIA(), 0], [$this->ym(2000, 5), $this->ym(2000, 4), CU::MILLENNIA(), 0], [$this->ym(2000, 5), $this->ym(2000, 5), CU::MILLENNIA(), 0], [$this->ym(2000, 5), $this->ym(2000, 6), CU::MILLENNIA(), 0], [$this->ym(2000, 5), $this->ym(3000, 4), CU::MILLENNIA(), 0], [$this->ym(2000, 5), $this->ym(3000, 5), CU::MILLENNIA(), 1], [$this->ym(2000, 5), $this->ym(3000, 5), CU::MILLENNIA(), 1]]; }
function data_goodTemporalUnit() { return [[2, CU::DAYS()], [2, CU::MONTHS()], [2, CU::YEARS()]]; }
public function test_isSupported_TemporalUnit() { // TODO $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(null), false); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::NANOS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::MICROS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::MILLIS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::SECONDS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::MINUTES()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::HOURS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::HALF_DAYS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::DAYS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::WEEKS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::MONTHS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::YEARS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::DECADES()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::CENTURIES()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::MILLENNIA()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::ERAS()), true); $this->assertEquals($this->TEST_DATE_TIME->isUnitSupported(CU::FOREVER()), false); }
function data_periodUntilUnit() { return [[$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::DAYS(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::WEEKS(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::MONTHS(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::YEARS(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::DECADES(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::CENTURIES(), 0], [$this->date(2000, 1, 1), $this->date(2000, 1, 1), CU::MILLENNIA(), 0], [$this->date(2000, 1, 15), $this->date(2000, 2, 14), CU::DAYS(), 30], [$this->date(2000, 1, 15), $this->date(2000, 2, 15), CU::DAYS(), 31], [$this->date(2000, 1, 15), $this->date(2000, 2, 16), CU::DAYS(), 32], [$this->date(2000, 1, 15), $this->date(2000, 2, 17), CU::WEEKS(), 4], [$this->date(2000, 1, 15), $this->date(2000, 2, 18), CU::WEEKS(), 4], [$this->date(2000, 1, 15), $this->date(2000, 2, 19), CU::WEEKS(), 5], [$this->date(2000, 1, 15), $this->date(2000, 2, 20), CU::WEEKS(), 5], [$this->date(2000, 1, 15), $this->date(2000, 2, 14), CU::MONTHS(), 0], [$this->date(2000, 1, 15), $this->date(2000, 2, 15), CU::MONTHS(), 1], [$this->date(2000, 1, 15), $this->date(2000, 2, 16), CU::MONTHS(), 1], [$this->date(2000, 1, 15), $this->date(2000, 3, 14), CU::MONTHS(), 1], [$this->date(2000, 1, 15), $this->date(2000, 3, 15), CU::MONTHS(), 2], [$this->date(2000, 1, 15), $this->date(2000, 3, 16), CU::MONTHS(), 2], [$this->date(2000, 1, 15), $this->date(2001, 1, 14), CU::YEARS(), 0], [$this->date(2000, 1, 15), $this->date(2001, 1, 15), CU::YEARS(), 1], [$this->date(2000, 1, 15), $this->date(2001, 1, 16), CU::YEARS(), 1], [$this->date(2000, 1, 15), $this->date(2004, 1, 14), CU::YEARS(), 3], [$this->date(2000, 1, 15), $this->date(2004, 1, 15), CU::YEARS(), 4], [$this->date(2000, 1, 15), $this->date(2004, 1, 16), CU::YEARS(), 4], [$this->date(2000, 1, 15), $this->date(2010, 1, 14), CU::DECADES(), 0], [$this->date(2000, 1, 15), $this->date(2010, 1, 15), CU::DECADES(), 1], [$this->date(2000, 1, 15), $this->date(2100, 1, 14), CU::CENTURIES(), 0], [$this->date(2000, 1, 15), $this->date(2100, 1, 15), CU::CENTURIES(), 1], [$this->date(2000, 1, 15), $this->date(3000, 1, 14), CU::MILLENNIA(), 0], [$this->date(2000, 1, 15), $this->date(3000, 1, 15), CU::MILLENNIA(), 1]]; }
public static function init() { self::$NANO_OF_SECOND = new ChronoField(0, "NanoOfSecond", ChronoUnit::NANOS(), ChronoUnit::SECONDS(), ValueRange::of(0, 999999999)); self::$NANO_OF_DAY = new ChronoField(1, "NanoOfDay", ChronoUnit::NANOS(), ChronoUnit::DAYS(), ValueRange::of(0, 86400 * 1000000000 - 1)); self::$MICRO_OF_SECOND = new ChronoField(2, "MicroOfSecond", ChronoUnit::MICROS(), ChronoUnit::SECONDS(), ValueRange::of(0, 999999)); self::$MICRO_OF_DAY = new ChronoField(3, "MicroOfDay", ChronoUnit::MICROS(), ChronoUnit::DAYS(), ValueRange::of(0, 86400 * 1000000 - 1)); self::$MILLI_OF_SECOND = new ChronoField(4, "MilliOfSecond", ChronoUnit::MILLIS(), ChronoUnit::SECONDS(), ValueRange::of(0, 999)); self::$MILLI_OF_DAY = new ChronoField(5, "MilliOfDay", ChronoUnit::MILLIS(), ChronoUnit::DAYS(), ValueRange::of(0, 86400 * 1000 - 1)); self::$SECOND_OF_MINUTE = new ChronoField(6, "SecondOfMinute", ChronoUnit::SECONDS(), ChronoUnit::MINUTES(), ValueRange::of(0, 59), "second"); self::$SECOND_OF_DAY = new ChronoField(7, "SecondOfDay", ChronoUnit::SECONDS(), ChronoUnit::DAYS(), ValueRange::of(0, 86400 - 1)); self::$MINUTE_OF_HOUR = new ChronoField(8, "MinuteOfHour", ChronoUnit::MINUTES(), ChronoUnit::HOURS(), ValueRange::of(0, 59), "minute"); self::$MINUTE_OF_DAY = new ChronoField(9, "MinuteOfDay", ChronoUnit::MINUTES(), ChronoUnit::DAYS(), ValueRange::of(0, 24 * 60 - 1)); self::$HOUR_OF_AMPM = new ChronoField(10, "HourOfAmPm", ChronoUnit::HOURS(), ChronoUnit::HALF_DAYS(), ValueRange::of(0, 11)); self::$CLOCK_HOUR_OF_AMPM = new ChronoField(11, "ClockHourOfAmPm", ChronoUnit::HOURS(), ChronoUnit::HALF_DAYS(), ValueRange::of(1, 12)); self::$HOUR_OF_DAY = new ChronoField(12, "HourOfDay", ChronoUnit::HOURS(), ChronoUnit::DAYS(), ValueRange::of(0, 23), "hour"); self::$CLOCK_HOUR_OF_DAY = new ChronoField(13, "ClockHourOfDay", ChronoUnit::HOURS(), ChronoUnit::DAYS(), ValueRange::of(1, 24)); self::$AMPM_OF_DAY = new ChronoField(14, "AmPmOfDay", ChronoUnit::HALF_DAYS(), ChronoUnit::DAYS(), ValueRange::of(0, 1), "dayperiod"); self::$DAY_OF_WEEK = new ChronoField(15, "DayOfWeek", ChronoUnit::DAYS(), ChronoUnit::WEEKS(), ValueRange::of(1, 7), "weekday"); self::$ALIGNED_DAY_OF_WEEK_IN_MONTH = new ChronoField(16, "AlignedDayOfWeekInMonth", ChronoUnit::DAYS(), ChronoUnit::WEEKS(), ValueRange::of(1, 7)); self::$ALIGNED_DAY_OF_WEEK_IN_YEAR = new ChronoField(17, "AlignedDayOfWeekInYear", ChronoUnit::DAYS(), ChronoUnit::WEEKS(), ValueRange::of(1, 7)); self::$DAY_OF_MONTH = new ChronoField(18, "DayOfMonth", ChronoUnit::DAYS(), ChronoUnit::MONTHS(), ValueRange::ofVariable(1, 28, 31), "day"); self::$DAY_OF_YEAR = new ChronoField(19, "DayOfYear", ChronoUnit::DAYS(), ChronoUnit::YEARS(), ValueRange::ofVariable(1, 365, 366)); self::$EPOCH_DAY = new ChronoField(20, "EpochDay", ChronoUnit::DAYS(), ChronoUnit::FOREVER(), ValueRange::of(Year::MIN_VALUE * 365.25, Year::MAX_VALUE * 365.25)); self::$ALIGNED_WEEK_OF_MONTH = new ChronoField(21, "AlignedWeekOfMonth", ChronoUnit::WEEKS(), ChronoUnit::MONTHS(), ValueRange::ofVariable(1, 4, 5)); self::$ALIGNED_WEEK_OF_YEAR = new ChronoField(22, "AlignedWeekOfYear", ChronoUnit::WEEKS(), ChronoUnit::YEARS(), ValueRange::of(1, 53)); self::$MONTH_OF_YEAR = new ChronoField(23, "MonthOfYear", ChronoUnit::MONTHS(), ChronoUnit::YEARS(), ValueRange::of(1, 12), "month"); self::$PROLEPTIC_MONTH = new ChronoField(24, "ProlepticMonth", ChronoUnit::MONTHS(), ChronoUnit::FOREVER(), ValueRange::of(Year::MIN_VALUE * 12, Year::MAX_VALUE * 12 + 11)); self::$YEAR_OF_ERA = new ChronoField(25, "YearOfEra", ChronoUnit::YEARS(), ChronoUnit::FOREVER(), ValueRange::ofVariable(1, Year::MAX_VALUE, Year::MAX_VALUE + 1)); self::$YEAR = new ChronoField(26, "Year", ChronoUnit::YEARS(), ChronoUnit::FOREVER(), ValueRange::of(Year::MIN_VALUE, Year::MAX_VALUE), "year"); self::$ERA = new ChronoField(27, "Era", ChronoUnit::ERAS(), ChronoUnit::FOREVER(), ValueRange::of(0, 1), "era"); self::$INSTANT_SECONDS = new ChronoField(28, "InstantSeconds", ChronoUnit::SECONDS(), ChronoUnit::FOREVER(), ValueRange::of(Long::MIN_VALUE, Long::MAX_VALUE)); self::$OFFSET_SECONDS = new ChronoField(29, "OffsetSeconds", ChronoUnit::SECONDS(), ChronoUnit::FOREVER(), ValueRange::of(-18 * 3600, 18 * 3600)); }
/** * Subtracts this period from the specified temporal object. * <p> * This returns a temporal object of the same observable type as the input * with this period subtracted. * If the temporal has a chronology, it must be the ISO chronology. * <p> * In most cases, it is clearer to reverse the calling pattern by using * {@link Temporal#minus(TemporalAmount)}. * <pre> * // these two lines are equivalent, but the second approach is recommended * dateTime = thisPeriod.subtractFrom(dateTime); * dateTime = dateTime.minus(thisPeriod); * </pre> * <p> * The calculation operates as follows. * First, the chronology of the temporal is checked to ensure it is ISO chronology or null. * Second, if the months are zero, the years are subtracted if non-zero, otherwise * the combination of years and months is subtracted if non-zero. * Finally, any days are subtracted. * <p> * This approach ensures that a partial period can be subtracted from a partial date. * For example, a period of years and/or months can be subtracted from a {@code YearMonth}, * but a period including days cannot. * The approach also subtracts years and months together when necessary, which ensures * correct behaviour at the end of the month. * <p> * This instance is immutable and unaffected by this method call. * * @param Temporal $temporal the temporal object to adjust, not null * @return Temporal an object of the same type with the adjustment made, not null * @throws DateTimeException if unable to subtract * @throws ArithmeticException if numeric overflow occurs */ public function subtractFrom(Temporal $temporal) { $this->validateChrono($temporal); if ($this->months == 0) { if ($this->years != 0) { $temporal = $temporal->minus($this->years, ChronoUnit::YEARS()); } } else { $totalMonths = $this->toTotalMonths(); if ($totalMonths != 0) { $temporal = $temporal->minus($totalMonths, ChronoUnit::MONTHS()); } } if ($this->days != 0) { $temporal = $temporal->minus($this->days, ChronoUnit::DAYS()); } return $temporal; }