/** * 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); }
/** * @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)); }
/** * 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); }