Класс Duration
public abstract class Duration extends Object
Неизменяемое представление временного интервала, определённое в спецификации W3C XML Schema 1.0.
Объект Duration представляет период времени по григорианскому календарю, состоящий из шести полей (годы, месяцы, дни, часы, минуты и секунды), а также поля знака (+/-).
Первые пять полей содержат неотрицательные целые числа (>=0) или null (что означает, что поле не задано), а поле секунд содержит неотрицательное десятичное число или null. Отрицательный знак указывает на отрицательную длительность.
Этот класс предоставляет ряд методов, упрощающих работу с типом данных duration из XML Schema 1.0 с учётом исправлений.
Отношение порядка
Для объектов Duration задан только частичный порядок: два значения A и B могут соотноситься одним из следующих способов:
- A<B (A короче B)
- A>B (A длиннее B)
- A==B (длительности A и B одинаковы)
- A<>B (сравнение A и B неопределено)
Например, 30 дней нельзя содержательно сравнить с одним месяцем. Метод compare(Duration duration) реализует это отношение.
Подробнее об отношении порядка между объектами Duration см. в методе isLongerThan(Duration).
Операции над Duration
Этот класс предоставляет набор основных арифметических операций, таких как сложение, вычитание и умножение. Поскольку для длительностей не задан полный порядок, некоторые комбинации операций могут завершиться неудачей. Например, нельзя вычесть 15 дней из 1 месяца. Подробные условия, при которых это может произойти, см. в документации соответствующих методов.
Деление длительности на число также не предоставляется, поскольку класс Duration может работать только с десятичными числами конечной точности. Например, нельзя представить 1 секунду, делённую на 3.
Однако деление на 3 можно заменить умножением на такие числа, как 0.3 или 0.333.
Допустимый диапазон значений
Поскольку некоторые операции с Duration зависят от Calendar, хотя Duration может хранить очень большие или очень малые значения, некоторые методы могут работать некорректно с такими объектами Duration. В документации методов, на которые это влияет, указана их зависимость от Calendar.
- Начиная с:
- 1.5
- См. также:
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Duration() |
Конструктор без аргументов по умолчанию. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
abstract Duration |
add |
Вычисляет новую длительность со значением this+rhs. |
abstract void |
addTo |
Добавляет эту длительность к объекту Calendar. |
void |
addTo |
Добавляет эту длительность к объекту Date. |
abstract int |
compare |
Сравнивает по отношению частичного порядка с этим экземпляром Duration. |
boolean |
equals |
Проверяет, равна ли длительность этого объекта длительности другого объекта Duration. |
int |
getDays() |
Возвращает значение поля DAYS как целое число или 0, если поле не задано. |
abstract Number |
getField |
Возвращает значение поля. |
int |
getHours() |
Возвращает значение поля HOURS как целое число или 0, если поле не задано. |
int |
getMinutes() |
Возвращает значение поля MINUTES как целое число или 0, если поле не задано. |
int |
getMonths() |
Возвращает значение поля MONTHS как целое число или 0, если поле не задано. |
int |
getSeconds() |
Возвращает значение поля SECONDS как целое число или 0, если поле не задано. |
abstract int |
getSign() |
Возвращает знак этой длительности: -1, 0 или 1. |
long |
getTimeInMillis |
Возвращает длительность в миллисекундах. |
long |
getTimeInMillis |
Возвращает длительность в миллисекундах. |
QName |
getXMLSchemaType() |
Возвращает имя типа даты/времени XML Schema, которому соответствует этот экземпляр. |
int |
getYears() |
Возвращает значение лет этого Duration как int или 0, если поле не задано. |
abstract int |
hashCode() |
Возвращает хеш-код, согласованный с определением метода equals. |
boolean |
isLongerThan |
Проверяет, строго ли длительность этого объекта превышает длительность другого объекта Duration. |
abstract boolean |
isSet |
Проверяет, задано ли поле. |
boolean |
isShorterThan |
Проверяет, строго ли длительность этого объекта меньше длительности другого объекта Duration. |
Duration |
multiply |
Вычисляет новую длительность, значение которой в factor раз больше значения этой длительности. |
abstract Duration |
multiply |
Вычисляет новую длительность, значение которой в factor раз больше значения этой длительности. |
abstract Duration |
negate() |
Возвращает новый объект Duration со значением -this. |
abstract Duration |
normalizeWith |
Преобразует поля лет и месяцев в поле дней, используя конкретный момент времени в качестве точки отсчёта. |
Duration |
subtract |
Вычисляет новую длительность со значением this-rhs. |
String |
toString() |
Возвращает строковое представление этого Duration Object в формате String. |
Методы, объявленные в классе Object
clone, finalize, getClass, notify, notifyAll, wait, wait, wait | Модификатор и тип | Метод | Описание |
|---|---|---|
protected Object |
clone() |
Создаёт и возвращает копию этого объекта. |
protected void |
finalize() |
Устарело, будет удалено: этот элемент API может быть удалён в будущей версии. Финализация устарела и будет удалена в одном из будущих выпусков. |
final Class |
getClass() |
Возвращает класс времени выполнения этого Object. |
final void |
notify() |
Пробуждает один поток, ожидающий на мониторе этого объекта. |
final void |
notifyAll() |
Пробуждает все потоки, ожидающие на мониторе этого объекта. |
final void |
wait() |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
final void |
wait |
Переводит текущий поток в состояние ожидания до его пробуждения, обычно в результате вызова notify или interrupt, либо до истечения заданного промежутка реального времени. |
Подробное описание конструкторов
Duration
public Duration()
Примечание: всегда используйте DatatypeFactory для создания экземпляра Duration. Нельзя гарантировать, что конструктор этого класса создаст объект в согласованном состоянии; в будущем он может быть удалён.
Подробное описание методов
getXMLSchemaType
public QName getXMLSchemaType()
isSet(DatatypeConstants.Field field) == true. | Тип данных | год | месяц | день | час | минута | секунда |
|---|---|---|---|---|---|---|
DatatypeConstants.DURATION | X | X | X | X | X | X |
DatatypeConstants.DURATION_DAYTIME | X | X | X | X | ||
DatatypeConstants.DURATION_YEARMONTH | X | X |
- Возвращает:
- одну из следующих констант:
DatatypeConstants.DURATION,DatatypeConstants.DURATION_DAYTIMEилиDatatypeConstants.DURATION_YEARMONTH. - Выбрасывает:
-
IllegalStateException— если сочетание установленных полей не соответствует ни одному из типов даты и времени XML Schema.
getSign
public abstract int getSign()
- Возвращает:
- -1, если эта длительность отрицательна, 0, если она равна нулю, и 1, если она положительна.
getYears
public int getYears()
Duration в виде int или 0, если оно отсутствует. getYears() — это удобный метод для вызова getField(DatatypeConstants.YEARS).
Поскольку возвращаемое значение имеет тип int, для Durations, количество лет в которых выходит за пределы диапазона int, будет возвращено некорректное значение. Во избежание возможной потери точности используйте getField(DatatypeConstants.YEARS).
- Возвращает:
- Если поле лет присутствует, возвращает его значение в виде
int, иначе возвращает0.
getMonths
public int getMonths()
getYears(), но применяется к полю MONTHS.- Возвращает:
- Количество месяцев этой
Duration.
getDays
public int getDays()
getYears(), но применяется к полю DAYS.- Возвращает:
- Количество дней этой
Duration.
getHours
public int getHours()
getYears(), но применяется к полю HOURS.- Возвращает:
- Количество часов этой
Duration.
getMinutes
public int getMinutes()
getYears(), но применяется к полю MINUTES.- Возвращает:
- Количество минут этой
Duration.
getSeconds
public int getSeconds()
getYears(), но применяется к полю SECONDS.- Возвращает:
- целое значение секунд. Дробная часть секунд отбрасывается (например, если фактическое значение равно 2.5, этот метод возвращает 2)
getTimeInMillis
public long getTimeInMillis(Calendar startInstant)
Если поле секунд содержит больше цифр, чем допускает точность до миллисекунд, они просто отбрасываются (иначе говоря, округляются до нуля). Например, для любого значения Calendar x,
new Duration("PT10.00099S").getTimeInMills(x) == 10000new Duration("-PT10.00099S").getTimeInMills(x) == -10000
Обратите внимание, что этот метод использует метод addTo(Calendar), который может работать некорректно с объектами Duration, поля которых содержат очень большие значения. Подробности см. в описании метода addTo(Calendar).
- Параметры:
-
startInstant— длительность месяца или года может меняться. Для устранения этой неоднозначности используетсяstartInstant. В частности, этот метод возвращает разницу междуstartInstantиstartInstant+duration - Возвращает:
- количество миллисекунд между
startInstantиstartInstantплюс этаDuration - Выбрасывает:
-
NullPointerException— если параметрstartInstantравен null.
getTimeInMillis
public long getTimeInMillis(Date startInstant)
Если поле секунд содержит больше цифр, чем допускает точность до миллисекунд, они просто отбрасываются (иначе говоря, округляются до нуля). Например, для любого значения Date x,
new Duration("PT10.00099S").getTimeInMills(x) == 10000new Duration("-PT10.00099S").getTimeInMills(x) == -10000
Обратите внимание, что этот метод использует метод addTo(Date), который может работать некорректно с объектами Duration, поля которых содержат очень большие значения. Подробности см. в описании метода addTo(Date).
- Параметры:
-
startInstant— длительность месяца или года может меняться. Для устранения этой неоднозначности используетсяstartInstant. В частности, этот метод возвращает разницу междуstartInstantиstartInstant+duration. - Возвращает:
- количество миллисекунд между
startInstantиstartInstantплюс этаDuration - Выбрасывает:
-
NullPointerException— если параметр startInstant равен null. - См. также:
getField
public abstract Number getField(DatatypeConstants.Field field)
Number. Для YEARS, MONTHS, DAYS, HOURS и MINUTES возвращаемое число будет неотрицательным целым числом. Для секунд возвращаемое число может быть неотрицательным десятичным числом.- Параметры:
-
field— одна из шести констант Field (YEARS, MONTHS, DAYS, HOURS, MINUTES или SECONDS). - Возвращает:
- Если указанное поле присутствует, метод возвращает ненулевой неотрицательный объект
Number, представляющий его значение. Если поле отсутствует, возвращает null. Для YEARS, MONTHS, DAYS, HOURS и MINUTES этот метод возвращает объектBigInteger. Для SECONDS этот метод возвращает объектBigDecimal. - Выбрасывает:
-
NullPointerException— еслиfieldравенnull.
isSet
public abstract boolean isSet(DatatypeConstants.Field field)
- Параметры:
-
field— одна из шести констант Field (YEARS, MONTHS, DAYS, HOURS, MINUTES или SECONDS). - Возвращает:
- true, если поле присутствует; false — если отсутствует.
- Выбрасывает:
-
NullPointerException— если параметр field равен null.
add
public abstract Duration add(Duration rhs)
this+rhs. Например:
"1 day" + "-3 days" = "-2 days" "1 year" + "1 day" = "1 year and 1 day" "-(1 hour,50 minutes)" + "-20 minutes" = "-(1 hours,70 minutes)" "15 hours" + "-3 days" = "-(2 days,9 hours)" "1 year" + "-1 day" = IllegalStateException
Поскольку невозможно осмысленно вычесть 1 день из 1 месяца, в некоторых случаях операция завершается ошибкой IllegalStateException.
Формально вычисление определяется следующим образом.
Сначала можно без потери общности предположить, что обе складываемые Durations положительны (то есть (-X)+Y=Y-X, X+(-Y)=X-Y, (-X)+(-Y)=-(X+Y)).
Сложение двух положительных Durations определяется как сложение полей по отдельности, при этом отсутствующие поля считаются равными 0.
Поле результирующей Duration не будет установлено тогда и только тогда, когда соответствующие поля обеих входных Durations не установлены.
Обратите внимание, что lhs.add(rhs) всегда завершается успешно, если lhs.signum()*rhs.signum()!=-1 или обе длительности нормализованы.
- Параметры:
-
rhs—Duration, которую нужно прибавить к этойDuration - Возвращает:
- корректный ненулевой объект Duration.
- Выбрасывает:
-
NullPointerException— если параметр rhs равен null. -
IllegalStateException— если две длительности нельзя осмысленно сложить. Например, при прибавлении минус одного дня к одному месяцу возникает это исключение. - См. также:
addTo
public abstract void addTo(Calendar calendar)
Calendar. Вызывает Calendar.add(int,int) для присутствующих полей в следующем порядке: YEARS, MONTHS, DAYS, HOURS, MINUTES, SECONDS и MILLISECONDS. Поскольку класс Calendar использует тип int для хранения значений, в некоторых случаях этот метод работает некорректно (например, если значения полей выходят за пределы диапазона int).
Кроме того, поскольку этот класс длительности представляет григорианскую длительность, метод работает некорректно, если переданный объект Calendar основан на другой календарной системе.
Все дробные части этого объекта Duration, превышающие миллисекунды, просто игнорируются. Например, если эта длительность равна "P1.23456S", к SECONDS будет прибавлено 1, к MILLISECONDS — 234, а оставшаяся часть не будет использована.
Обратите внимание: поскольку Calendar.add(int, int) использует int, значения Duration, выходящие за пределы диапазона int в полях, приведут к переполнению/недополнению переданного объекта Calendar. Метод XMLGregorianCalendar.add(Duration) выполняет ту же основную операцию, что и этот метод, и при этом позволяет избежать проблем переполнения/недополнения.
- Параметры:
-
calendar— объект календаря, значение которого будет изменено. - Выбрасывает:
-
NullPointerException— если параметр calendar равен null.
addTo
public void addTo(Date date)
Date. Сначала переданная дата преобразуется в GregorianCalendar, затем к ней прибавляется длительность — точно так же, как в методе addTo(Calendar).
Затем полученный момент времени преобразуется обратно в объект Date и используется для обновления переданного объекта Date.
Это несколько избыточное вычисление необходимо, чтобы однозначно определить длительность месяцев и лет.
- Параметры:
-
date— объект даты, значение которого будет изменено. - Выбрасывает:
-
NullPointerException— если параметр date равен null.
subtract
public Duration subtract(Duration rhs)
this-rhs. Например:
"1 day" - "-3 days" = "4 days" "1 year" - "1 day" = IllegalStateException "-(1 hour,50 minutes)" - "-20 minutes" = "-(1hours,30 minutes)" "15 hours" - "-3 days" = "3 days and 15 hours" "1 year" - "-1 day" = "1 year and 1 day"
Поскольку невозможно осмысленно вычесть 1 день из 1 месяца, в некоторых случаях операция завершается ошибкой IllegalStateException.
Формально вычисление определяется следующим образом. Сначала можно без потери общности предположить, что обе Durations положительны (то есть (-X)-Y=-(X+Y), X-(-Y)=X+Y, (-X)-(-Y)=-(X-Y)).
Затем две длительности вычитаются по полям. Если знак любого ненулевого поля F отличается от знака наиболее значимого поля, из следующей более крупной единицы F заимствуется 1 (если F отрицательно) или -1 (в противном случае).
Этот процесс повторяется, пока все ненулевые поля не будут иметь одинаковый знак.
Если заимствование происходит в поле дней (то есть если для компенсации дней необходимо заимствовать 1 или -1 месяц), вычисление завершается ошибкой: выбрасывается IllegalStateException.
- Параметры:
-
rhs—Duration, которую нужно вычесть из этойDuration. - Возвращает:
- Новая
Duration, полученная вычитаниемrhsиз этойDuration. - Выбрасывает:
-
IllegalStateException— если две длительности нельзя осмысленно вычесть. Например, при вычитании одного дня из одного месяца возникает это исключение. -
NullPointerException— если параметр rhs равен null. - См. также:
multiply
public Duration multiply(int factor)
factor раз больше значения этой длительности. Этот метод предоставлен для удобства. Функционально он эквивалентен следующему коду:
multiply(new BigDecimal(String.valueOf(factor)))
- Параметры:
-
factor— во сколько раз увеличить создаваемую новуюDuration. - Возвращает:
- Новую
Duration, которая вfactorраз больше этойDuration. - См. также:
multiply
public abstract Duration multiply(BigDecimal factor)
factor раз больше значения этой длительности. Например:
"P1M" (1 month) * "12" = "P12M" (12 months) "PT1M" (1 min) * "0.3" = "PT18S" (18 seconds) "P1M" (1 month) * "1.5" = IllegalStateException
Поскольку класс Duration неизменяемый, этот метод не изменяет значение данного объекта. Он просто вычисляет новый объект Duration и возвращает его.
Операция выполняется для каждого поля отдельно с точностью BigDecimal. Поскольку все поля, кроме секунд, могут содержать только целые числа, любая дробная часть, полученная при вычислении, переносится в следующую меньшую единицу. Например, если умножить "P1D" (1 день) на "0.5", получится 0.5 дня, которые будут преобразованы в "PT12H" (12 часов). Если дробную часть месяца нельзя осмысленно преобразовать в дни или года — в месяцы, будет выброшено исключение IllegalStateException. Например, оно возникает при умножении одного месяца на 0.5.
Чтобы избежать IllegalStateException, используйте метод normalizeWith(Calendar), чтобы удалить поля лет и месяцев.
- Параметры:
-
factor— множитель - Возвращает:
- возвращает корректный ненулевой объект
Duration - Выбрасывает:
-
IllegalStateException— если операция приводит к появлению дробной части в поле месяцев. -
NullPointerException— если параметрfactorравенnull.
negate
public abstract Duration negate()
Duration, значение которого равно -this. Поскольку класс Duration неизменяемый, этот метод не изменяет значение данного объекта. Он просто вычисляет новый объект Duration и возвращает его.
- Возвращает:
- всегда возвращает корректный ненулевой объект
Duration.
normalizeWith
public abstract Duration normalizeWith(Calendar startTimeInstant)
Например, длительность в один месяц нормализуется до 31 дня, если начальный момент времени — «8 июля 2003 г., 17:40:32».
Формально вычисление выполняется следующим образом:
- создаётся копия переданного объекта Calendar
- к объекту
Calendarприбавляются поля лет, месяцев и дней с помощью методаCalendar.add(int,int) - разница между двумя объектами Calendar вычисляется в миллисекундах и преобразуется в дни; остаток, возникающий из-за перехода на летнее время, отбрасывается
- вычисленное количество дней вместе с полями часов, минут и секунд этого объекта длительности используется для создания нового объекта Duration.
Обратите внимание: поскольку класс Calendar использует int для хранения значения года и месяца, этот метод может дать неожиданный результат, если поля лет или месяцев этого объекта длительности содержат очень большие значения.
- Параметры:
-
startTimeInstant—Calendar, используемая в качестве точки отсчёта. - Возвращает:
-
Durationлет и месяцев этойDurationв виде дней. - Выбрасывает:
-
NullPointerException— если параметр startTimeInstant равен null.
compare
public abstract int compare(Duration duration)
Duration. Результат сравнения должен соответствовать документу W3C XML Schema 1.0, часть 2, раздел 3.2.7.6.2, Отношение порядка для длительности.
Результат:
-
DatatypeConstants.LESSER, если этаDurationкороче параметраduration -
DatatypeConstants.EQUAL, если этаDurationравна параметруduration -
DatatypeConstants.GREATER, если этаDurationдлиннее параметраduration -
DatatypeConstants.INDETERMINATE, если невозможно определить однозначное отношение частичного порядка
- Параметры:
-
duration— объект для сравнения - Возвращает:
- отношение между
this Durationи параметромdurationв видеDatatypeConstants.LESSER,DatatypeConstants.EQUAL,DatatypeConstants.GREATERилиDatatypeConstants.INDETERMINATE. - Выбрасывает:
-
UnsupportedOperationException— если базовая реализация не может обработать запрос, например, если запрашиваемые значения выходят за пределы её возможностей; W3C XML Schema допускает сколь угодно большие, малые и точные значения. -
NullPointerException— еслиdurationравноnull. - См. также:
isLongerThan
public boolean isLongerThan(Duration duration)
Duration. Длительность X «длиннее» Y тогда и только тогда, когда X > Y согласно определению в разделе 3.2.6.2 спецификации XML Schema 1.0.
Например, "P1D" (один день) > "PT12H" (12 часов), а "P2Y" (два года) > "P23M" (23 месяца).
- Параметры:
-
duration—Duration, с которым сравнивается этаDuration. - Возвращает:
- true, если длительность, представленная этим объектом, длиннее переданной длительности; в противном случае — false.
- Выбрасывает:
-
UnsupportedOperationException— если базовая реализация не может обработать запрос, например, если запрашиваемые значения выходят за пределы её возможностей; W3C XML Schema допускает сколь угодно большие, малые и точные значения. -
NullPointerException— еслиdurationравно null. - См. также:
isShorterThan
public boolean isShorterThan(Duration duration)
Duration.- Параметры:
-
duration—Duration, с которым сравнивается этаDuration. - Возвращает:
-
true, если параметрdurationкороче этойDuration; в противном случае —false. - Выбрасывает:
-
UnsupportedOperationException— если базовая реализация не может обработать запрос, например, если запрашиваемые значения выходят за пределы её возможностей; W3C XML Schema допускает сколь угодно большие, малые и точные значения. -
NullPointerException— еслиdurationравен null. - См. также:
equals
public boolean equals(Object duration)
Duration. Например, "P1D" (1 день) равен "PT24H" (24 часа).
Длительность X равна Y тогда и только тогда, когда моменты времени t+X и t+Y совпадают для всех тестовых моментов времени, указанных в разделе 3.2.6.2 спецификации XML Schema 1.0.
Обратите внимание, что в некоторых случаях две Durations несравнимы, например месяц и 30 дней. Например:
!new Duration("P1M").isShorterThan(new Duration("P30D"))
!new Duration("P1M").isLongerThan(new Duration("P30D"))
!new Duration("P1M").equals(new Duration("P30D"))
- Переопределяет:
-
equalsв классеObject - Параметры:
-
duration— объект, с которым сравнивается этаDuration. - Возвращает:
-
true, если эта длительность равнаduration.false, еслиdurationравенnull, не является объектомDurationили его длительность отличается от этой. - Выбрасывает:
-
UnsupportedOperationException— если базовая реализация не может обработать запрос, например, если запрашиваемые значения выходят за пределы её возможностей; W3C XML Schema допускает сколь угодно большие, малые и точные значения. - См. также:
hashCode
toString
public String toString()
String этой Duration Object. Результат форматируется в соответствии со спецификацией XML Schema 1.0 и всегда может быть впоследствии преобразован обратно в эквивалентную Duration Object с помощью метода DatatypeFactory.newDuration(String lexicalRepresentation).
Формально для любого Duration Object x выполняется следующее:
new Duration(x.toString()).equals(x)
© 1993, 2025, 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.