예제 #1
0
 /**
  * Returns a copy of this date-time with the specified field set to a new value.
  * <p>
  * This returns a {@code LocalDateTime}, based on this one, with the value
  * for the specified field changed.
  * This can be used to change any supported field, such as the year, month or day-of-month.
  * If it is not possible to set the value, because the field is not supported or for
  * some other reason, an exception is thrown.
  * <p>
  * In some cases, changing the specified field can cause the resulting date-time to become invalid,
  * such as changing the month from 31st January to February would make the day-of-month invalid.
  * In cases like this, the field is responsible for resolving the date. Typically it will choose
  * the previous valid date, which would be the last valid day of February in this example.
  * <p>
  * If the field is a {@link ChronoField} then the adjustment is implemented here.
  * The {@link #isSupported(TemporalField) supported fields} will behave as per
  * the matching method on {@link LocalDate#with(TemporalField, long) LocalDate}
  * or {@link LocalTime#with(TemporalField, long) LocalTime}.
  * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
  * <p>
  * If the field is not a {@code ChronoField}, then the result of this method
  * is obtained by invoking {@code TemporalField.adjustInto(Temporal, long)}
  * passing {@code this} as the argument. In this case, the field determines
  * whether and how to adjust the instant.
  * <p>
  * This instance is immutable and unaffected by this method call.
  *
  * @param TemporalField $field the field to set in the result, not null
  * @param int $newValue the new value of the field in the result
  * @return LocalDateTime a {@code LocalDateTime} based on {@code this} with the specified field set, not null
  * @throws DateTimeException if the field cannot be set
  * @throws UnsupportedTemporalTypeException if the field is not supported
  * @throws ArithmeticException if numeric overflow occurs
  */
 public function with(TemporalField $field, $newValue)
 {
     if ($field instanceof ChronoField) {
         $f = $field;
         if ($f->isTimeBased()) {
             return $this->_with($this->date, $this->time->with($field, $newValue));
         } else {
             return $this->_with($this->date->with($field, $newValue), $this->time);
         }
     }
     return $field->adjustInto($this, $newValue);
 }
예제 #2
0
 /**
  * @dataProvider data_withTemporalField_outOfRange
  */
 public function test_with_longTemporalField_invalid(TemporalField $field, LocalTime $base, $newValue)
 {
     try {
         $base->with($field, $newValue);
         $this->fail("Field should not be allowed " . $field);
     } catch (DateTimeException $ex) {
         // $expected
     }
 }
 public function with(TemporalField $field, $newValue)
 {
     if ($field instanceof ChronoField) {
         $f = $field;
         if ($f->isTimeBased()) {
             return $this->_with($this->date, $this->time->with($field, $newValue));
         } else {
             return $this->_with($this->date->with($field, $newValue), $this->time);
         }
     }
     return ChronoLocalDateTimeImpl::ensureValid($this->date->getChronology(), $field->adjustInto($this, $newValue));
 }
예제 #4
0
 /**
  * Returns a copy of this time with the specified field set to a new value.
  * <p>
  * This returns an {@code OffsetTime}, based on this one, with the value
  * for the specified field changed.
  * This can be used to change any supported field, such as the hour, minute or second.
  * If it is not possible to set the value, because the field is not supported or for
  * some other reason, an exception is thrown.
  * <p>
  * If the field is a {@link ChronoField} then the adjustment is implemented here.
  * <p>
  * The {@code OFFSET_SECONDS} field will return a time with the specified offset.
  * The local time is unaltered. If the new offset value is outside the valid range
  * then a {@code DateTimeException} will be thrown.
  * <p>
  * The other {@link #isSupported(TemporalField) supported fields} will behave as per
  * the matching method on {@link LocalTime#with(TemporalField, long)} LocalTime}.
  * In this case, the offset is not part of the calculation and will be unchanged.
  * <p>
  * All other {@code ChronoField} instances will throw an {@code UnsupportedTemporalTypeException}.
  * <p>
  * If the field is not a {@code ChronoField}, then the result of this method
  * is obtained by invoking {@code TemporalField.adjustInto(Temporal, long)}
  * passing {@code this} as the argument. In this case, the field determines
  * whether and how to adjust the instant.
  * <p>
  * This instance is immutable and unaffected by this method call.
  *
  * @param TemporalField $field the field to set in the result, not null
  * @param int $newValue the new value of the field in the result
  * @return OffsetTime an {@code OffsetTime} based on {@code this} with the specified field set, not null
  * @throws DateTimeException if the field cannot be set
  * @throws UnsupportedTemporalTypeException if the field is not supported
  * @throws ArithmeticException if numeric overflow occurs
  */
 public function with(TemporalField $field, $newValue)
 {
     if ($field instanceof ChronoField) {
         if ($field == ChronoField::OFFSET_SECONDS()) {
             $f = $field;
             return $this->_with($this->time, ZoneOffset::ofTotalSeconds($f->checkValidIntValue($newValue)));
         }
         return $this->_with($this->time->with($field, $newValue), $this->offset);
     }
     return $field->adjustInto($this, $newValue);
 }