public function zonedDateTimeFrom(TemporalAccessor $temporal)
 {
     try {
         $zone = ZoneId::from($temporal);
         try {
             $instant = Instant::from($temporal);
             return $this->zonedDateTime($instant, $zone);
         } catch (DateTimeException $ex1) {
             $cldt = ChronoLocalDateTimeImpl::ensureValid($this, $this->localDateTime($temporal));
             return ChronoZonedDateTimeImpl::ofBest($cldt, $zone, null);
         }
     } catch (DateTimeException $ex) {
         throw new DateTimeException("Unable to obtain ChronoZonedDateTime from TemporalAccessor: " . get_class($temporal), $ex);
     }
 }
 /**
  * @inheritdoc
  */
 public function atTime(LocalTime $localTime)
 {
     return ChronoLocalDateTimeImpl::of($this, $localTime);
 }
 /**
  * @inheritdoc
  */
 public function minus($amountToSubtract, TemporalUnit $unit)
 {
     return ChronoLocalDateTimeImpl::ensureValid($this->getChronology(), parent::minus($amountToSubtract, $unit));
 }
 public function until(Temporal $endExclusive, TemporalUnit $unit)
 {
     $end = $this->getChronology()->zonedDateTime($endExclusive);
     if ($unit instanceof ChronoUnit) {
         $end = $end->withZoneSameInstant($this->offset);
         return $this->dateTime->until($end->toLocalDateTime(), $unit);
     }
     return $unit->between($this, $end);
 }
 public function plus($amountToAdd, TemporalUnit $unit)
 {
     if ($unit instanceof ChronoUnit) {
         $f = $unit;
         switch ($f) {
             case ChronoUnit::NANOS():
                 return $this->plusNanos($amountToAdd);
             case ChronoUnit::MICROS():
                 return $this->plusDays(Math::div($amountToAdd, self::MICROS_PER_DAY))->plusNanos($amountToAdd % self::MICROS_PER_DAY * 1000);
             case ChronoUnit::MILLIS():
                 return $this->plusDays(Math::div($amountToAdd, self::MILLIS_PER_DAY))->plusNanos($amountToAdd % self::MILLIS_PER_DAY * 1000000);
             case ChronoUnit::SECONDS():
                 return $this->plusSeconds($amountToAdd);
             case ChronoUnit::MINUTES():
                 return $this->plusMinutes($amountToAdd);
             case ChronoUnit::HOURS():
                 return $this->plusHours($amountToAdd);
             case ChronoUnit::HALF_DAYS():
                 return $this->plusDays(Math::div($amountToAdd, 256))->plusHours($amountToAdd % 256 * 12);
                 // no overflow (256 is multiple of 2)
         }
         return $this->_with($this->date->plus($amountToAdd, $unit), $this->time);
     }
     return ChronoLocalDateTimeImpl::ensureValid($this->date->getChronology(), $unit->addTo($this, $amountToAdd));
 }