Spec-Zone.ru › OpenJDK 8

Интерфейс Temporal

Все суперинтерфейсы:
TemporalAccessor
Все известные подинтерфейсы:
ChronoLocalDate, ChronoLocalDateTime<D>, ChronoZonedDateTime<D>
Все известные реализующие классы:
HijrahDate, Instant, JapaneseDate, LocalDate, LocalDateTime, LocalTime, MinguoDate, OffsetDateTime, OffsetTime, ThaiBuddhistDate, Year, YearMonth, ZonedDateTime

public interface Temporal
extends TemporalAccessor

Интерфейс на уровне фреймворка, определяющий чтение и запись доступа к объекту временной шкалы, такому как дата, время, смещение или их комбинации.

Это базовый тип интерфейса для объектов даты, времени и смещения, достаточно полных для манипуляций с помощью операций «плюс» и «минус». Он реализуется теми классами, которые могут предоставлять и обрабатывать информацию в виде полей или запросов. См. TemporalAccessor для чтения-только версии этого интерфейса.

Большая часть информации о дате и времени может быть представлена как число. Они моделируются с использованием TemporalField, а число хранится с помощью long для обработки больших значений. Год, месяц и день месяца являются простыми примерами полей, но они также включают мгновение и смещения. См. ChronoField для стандартного набора полей.

Две части информации о дате/времени не могут быть представлены числами: хронология и часовой пояс. К ним можно получить доступ через queries с помощью статических методов, определённых в TemporalQuery.

Этот интерфейс является интерфейсом на уровне фреймворка, который не следует широко использовать в коде приложения. Вместо этого приложения должны создавать и передавать экземпляры конкретных типов, таких как LocalDate. Существует много причин для этого, в том числе то, что реализации этого интерфейса могут быть в системах календарей, отличных от ISO. См. ChronoLocalDate для более подробного обсуждения этих вопросов.

Когда следует реализовывать

Класс должен реализовывать этот интерфейс, если он соответствует трём критериям:

  • он предоставляет доступ к информации о дате/времени/смещении, как указано в TemporalAccessor
  • набор полей непрерывный от наибольшего к наименьшему
  • набор полей полный, так что ни одно другое поле не требуется для определения допустимого диапазона значений для представленных полей

Четыре примера проясняют это:

  • LocalDate реализует этот интерфейс, так как он представляет собой набор полей, непрерывных от дней до бесконечности и не требующих внешней информации для определения валидности каждой даты. Поэтому он может правильно реализовывать «плюс/минус».
  • LocalTime реализует этот интерфейс, так как он представляет собой набор полей, непрерывных от наносекунд до дней и не требующих внешней информации для определения валидности. Он может правильно реализовывать «плюс/минус», переходя на следующий день.
  • MonthDay, сочетание месяца и дня месяца, не реализует этот интерфейс. Хотя комбинация непрерывна, от дней до месяцев в годах, комбинация не содержит достаточной информации для определения допустимого диапазона значений для дня месяца. Поэтому он не может правильно реализовывать «плюс/минус».
  • Комбинация дня недели и дня месяца («пятница 13-е») не должна реализовывать этот интерфейс. Она не представляет непрерывный набор полей, так как дни недели накладываются на дни в месяцах.
Требования к реализации:
Этот интерфейс не накладывает ограничений на изменяемость реализаций, однако неизменяемость настоятельно рекомендуется. Все реализации должны быть Comparable.
С:
1.8

Методы

Модификатор и тип Метод и описание
boolean isSupported(TemporalUnit unit)

Проверяет, поддерживается ли указанный единица измерения.

default Temporal minus(long amountToSubtract, TemporalUnit unit)

Возвращает объект того же типа, что и этот объект, со значениями указанного периода вычтенными.

default Temporal minus(TemporalAmount amount)

Возвращает объект того же типа, что и этот объект, с вычтенным значением.

Temporal plus(long amountToAdd, TemporalUnit unit)

Возвращает объект того же типа, что и этот объект, с добавленным указанным периодом.

default Temporal plus(TemporalAmount amount)

Возвращает объект того же типа, что и этот объект, с добавленным значением.

long until(Temporal endExclusive, TemporalUnit unit)

Вычисляет количество времени до другого объекта временной шкалы в терминах указанной единицы.

default Temporal with(TemporalAdjuster adjuster)

Возвращает изменённый объект того же типа, что и этот объект, с выполненной корректировкой.

Temporal with(TemporalField field, long newValue)

Возвращает объект того же типа, что и этот объект, с изменённым указанным полем.

Методы, унаследованные от интерфейса java.time.temporal.TemporalAccessor

get, getLong, isSupported, query, range

Методы

isSupported

boolean isSupported(TemporalUnit unit)

Проверяет, поддерживается ли указанный объект времени.

Это проверяет, может ли указанный объект времени быть добавлен к этому объекту даты-времени или вычтен из него. Если false, то вызов методов plus(long, TemporalUnit) и minus вызовет исключение.

Требования к реализации:
Реализации должны проверить и обработать все единицы, определённые в ChronoUnit. Если единица поддерживается, то должно быть возвращено значение true, в противном случае - false.

Если поле не является ChronoUnit, то результат этого метода получается путём вызова TemporalUnit.isSupportedBy(Temporal) с this в качестве аргумента.

Реализации должны гарантировать, что при вызове этого метода только для чтения не изменяется состояние.

Параметры:
unit - единица для проверки, null возвращает false
Возвращает:
true, если единица может быть добавлена/вычтена, false - если нет

with

default Temporal with(TemporalAdjuster adjuster)

Возвращает изменённый объект того же типа, что и этот объект, с выполненной корректировкой.

Это корректирует эту дату-время в соответствии с правилами указанного корректировщика. Простой корректировщик может просто установить одно из полей, например, поле года. Более сложный корректировщик может установить дату на последнее число месяца. Выбор общих корректировок представлен в TemporalAdjusters. Они включают поиск "последнего дня месяца" и "следующей среды". Корректировщик отвечает за обработку особых случаев, таких как переменная длина месяца и високосные годы.

Некоторые примеры кода, показывающие, как и почему используется этот метод:

date = date.with(Month.JULY);        // most key classes implement TemporalAdjuster
  date = date.with(lastDayOfMonth());  // static import from Adjusters
  date = date.with(next(WEDNESDAY));   // static import from Adjusters and DayOfWeek
Требования к реализации:

Реализации не должны изменять ни этот объект, ни указанный временной объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Реализация по умолчанию должна вести себя так же, как этот код:

return adjuster.adjustInto(this);
Параметры:
adjuster - корректировщик для использования, не null
Возвращает:
объект того же типа с выполненной корректировкой, не null
Исключения:
DateTimeException - если корректировка не может быть выполнена
ArithmeticException - если происходит переполнение чисел

with

Temporal with(TemporalField field,
              long newValue)

Возвращает объект того же типа, что и этот объект, с изменённым указанным полем.

Это возвращает новый объект, основанный на этом объекте, с изменённым значением для указанного поля. Например, для LocalDate, это можно использовать для установки года, месяца или дня месяца. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 января, то изменение месяца на февраль будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.

Требования к реализации:
Реализации должны проверить и обработать все поля, определённые в ChronoField. Если поле поддерживается, то выполняется корректировка. Если не поддерживается, то должно быть выброшено UnsupportedTemporalTypeException.

Если поле не является ChronoField, то результат этого метода получается путём вызова TemporalField.adjustInto(Temporal, long) с this в качестве первого аргумента.

Реализации не должны изменять этот объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Параметры:
field - поле для установки в результате, не null
newValue - новое значение поля в результате
Возвращает:
объект того же типа с установленным указанным полем, не null
Исключения:
DateTimeException - если поле не может быть установлено
UnsupportedTemporalTypeException - если поле не поддерживается
ArithmeticException - если происходит переполнение чисел

plus

default Temporal plus(TemporalAmount amount)

Возвращает объект того же типа, что и этот объект, с добавленным значением.

Это корректирует эту временную метку, добавляя в соответствии с правилами указанного значения. Значение обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, такого как Duration.

Некоторые примеры кода, показывающие, как и почему используется этот метод:

date = date.plus(period);                // add a Period instance
  date = date.plus(duration);              // add a Duration instance
  date = date.plus(workingDays(6));        // example user-written workingDays method

Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.

Требования к реализации:

Реализации не должны изменять ни этот объект, ни указанный временной объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Реализация по умолчанию должна вести себя так же, как этот код:

return amount.addTo(this);
Параметры:
amount - значение для добавления, не null
Возвращает:
объект того же типа с выполненной корректировкой, не null
Исключения:
DateTimeException - если добавление невозможно
ArithmeticException - если происходит переполнение чисел

plus

Temporal plus(long amountToAdd,
              TemporalUnit unit)

Возвращает объект того же типа, что и этот объект, с добавленным указанным периодом.

Этот метод возвращает новый объект, основанный на этом объекте, с добавленным указанным периодом. Например, для LocalDate, это можно использовать для добавления количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 января, то добавление одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.

Требования к реализации:
Реализации должны проверить и обработать все единицы, определённые в ChronoUnit. Если единица поддерживается, то выполняется добавление. Если не поддерживается, то должно быть выброшено UnsupportedTemporalTypeException.

Если единица не является ChronoUnit, то результат этого метода получается путём вызова TemporalUnit.addTo(Temporal, long) с this в качестве первого аргумента.

Реализации не должны изменять этот объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Параметры:
amountToAdd - количество указанной единицы для добавления, может быть отрицательным
unit - единица значения для добавления, не null
Возвращает:
объект того же типа с добавленным указанным периодом, не null
Исключения:
DateTimeException - если единица не может быть добавлена
UnsupportedTemporalTypeException - если единица не поддерживается
ArithmeticException - если происходит переполнение чисел

minus

default Temporal minus(TemporalAmount amount)

Возвращает объект того же типа, что и этот объект, со значением, вычтенным из него.

Это корректирует эту временную метку, вычитая в соответствии с правилами указанного значения. Значение обычно является Period, но может быть любого другого типа, реализующего интерфейс TemporalAmount, такого как Duration.

Некоторые примеры кода, показывающие, как и почему используется этот метод:

date = date.minus(period);               // subtract a Period instance
  date = date.minus(duration);             // subtract a Duration instance
  date = date.minus(workingDays(6));       // example user-written workingDays method

Обратите внимание, что вызов plus за которым следует minus не гарантирует возвращение той же даты и времени.

Требования к реализации:

Реализации не должны изменять ни этот объект, ни указанный временной объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Реализация по умолчанию должна вести себя так же, как этот код:

return amount.subtractFrom(this);
Параметры:
amount - значение для вычитания, не null
Возвращает:
объект того же типа с выполненной корректировкой, не null
Исключения:
DateTimeException - если вычитание невозможно
ArithmeticException - если происходит переполнение чисел

minus

default Temporal minus(long amountToSubtract,
                       TemporalUnit unit)

Возвращает объект того же типа, что и этот объект, с указанным периодом, вычтенным из него.

Этот метод возвращает новый объект, основанный на этом объекте, с вычтенным указанным периодом. Например, для LocalDate, это можно использовать для вычитания количества лет, месяцев или дней. Возвращаемый объект будет иметь тот же наблюдаемый тип, что и этот объект.

В некоторых случаях изменение поля не полностью определено. Например, если целевой объект представляет дату 31 марта, то вычитание одного месяца будет неясно. В таких случаях поле отвечает за разрешение результата. Обычно оно выберет предыдущую допустимую дату, которая в этом примере будет последним допустимым днём февраля.

Требования к реализации:
Реализации должны вести себя так же, как реализация по умолчанию.

Реализации не должны изменять этот объект. Вместо этого должен быть возвращён скорректированный экземпляр оригинала. Это обеспечивает эквивалентное, безопасное поведение для неизменяемых и изменяемых реализаций.

Реализация по умолчанию должна вести себя так же, как этот код:

return (amountToSubtract == Long.MIN_VALUE ?
      plus(Long.MAX_VALUE, unit).plus(1, unit) : plus(-amountToSubtract, unit));
Параметры:
amountToSubtract - количество указанной единицы для вычитания, может быть отрицательным
unit - единица значения для вычитания, не null
Возвращает:
объект того же типа с вычтенным указанным периодом, не null
Исключения:
DateTimeException - если единица не может быть вычтена
UnsupportedTemporalTypeException - если единица не поддерживается
ArithmeticException - если происходит переполнение чисел

until

long until(Temporal endExclusive,
           TemporalUnit unit)

Вычисляет количество времени до другого временного объекта в заданных единицах измерения.

Это вычисляет количество времени между двумя временными объектами в единицах TemporalUnit. Начальная и конечная точки — this и указанный временной объект. Конечная точка преобразуется в тот же тип, что и начальная точка, если они разные. Результат будет отрицательным, если конечная точка предшествует начальной. Например, количество часов между двумя временными объектами можно вычислить с помощью startTime.until(endTime, HOURS).

Вычисление возвращает целое число, представляющее количество полных единиц между двумя временными объектами. Например, количество часов между временами 11:30 и 13:29 будет только одним, так как до двух часов не хватает одной минуты.

Существует два эквивалентных способа использования этого метода. Первый — вызвать этот метод напрямую. Второй — использовать TemporalUnit.between(Temporal, Temporal):

// these two lines are equivalent
   temporal = start.until(end, unit);
   temporal = unit.between(start, end);
Выбор следует делать, исходя из того, что делает код более читабельным.

Например, этот метод позволяет вычислить количество дней между двумя датами:

long daysBetween = start.until(end, DAYS);
  // or alternatively
  long daysBetween = DAYS.between(start, end);
Требования к реализации:
Реализации должны начинать с проверки, чтобы входной временной объект был того же наблюдаемого типа, что и реализация. Затем они должны выполнить вычисление для всех экземпляров ChronoUnit. Для UnsupportedTemporalTypeException экземпляров, которые не поддерживаются, должно быть выброшено исключение ChronoUnit.

Если единица измерения не является ChronoUnit, то результат этого метода получается путем вызова TemporalUnit.between(Temporal, Temporal), передав this в качестве первого аргумента и преобразованный входной временной объект в качестве второго аргумента.

Вкратце, реализации должны работать так же, как в этом псевдокоде:

// convert the end temporal to the same type as this class
  if (unit instanceof ChronoUnit) {
    // if unit is supported, then calculate and return result
    // else throw UnsupportedTemporalTypeException for unsupported units
  }
  return unit.between(this, convertedEndTemporal);

Обратите внимание, что метод between единицы должен вызываться только в том случае, если два временных объекта имеют ровно тот же тип, оцененный с помощью getClass().

Реализации должны гарантировать, что при вызове этого метода только для чтения состояние наблюдения не изменяется.

Параметры:
endExclusive - конечный временной объект, исключающий, преобразованный в тот же тип, что и этот объект, не null
unit - единица измерения, в которой измеряется количество, не null
Возвращает:
количество времени между этим временным объектом и указанным в заданных единицах измерения; положительное, если указанный объект позже, отрицательное, если раньше
Исключения:
DateTimeException - если количество не может быть вычислено или конечный временной объект не может быть преобразован в тот же тип, что и этот временной объект
UnsupportedTemporalTypeException - если единица измерения не поддерживается
ArithmeticException - если происходит переполнение числовых значений

© 1993, 2020, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API