Класс 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 такую же длительность, как другой объект 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. |
Подробное описание конструкторов
Duration
public Duration()
Примечание: для создания экземпляра Duration всегда используйте DatatypeFactory. Нельзя гарантировать, что конструктор этого класса создаст объект в согласованном состоянии; в будущем он может быть удалён.
Подробное описание методов
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— если параметр даты равен 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.
Формально вычисление определяется следующим образом. Сначала можно без потери общности предположить, что обе Duration положительны. (т. е. (-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, не равный null - Исключения:
-
IllegalStateException— если операция приводит к появлению дробной части в поле месяцев. -
NullPointerException— если параметрfactorравенnull.
negate
public abstract Duration negate()
Duration, значение которого равно -this. Поскольку класс Duration неизменяемый, этот метод не изменяет значение данного объекта. Он лишь вычисляет новый объект Duration и возвращает его.
- Возвращает:
- всегда возвращает допустимый объект
Duration, не равный null.
normalizeWith
public abstract Duration normalizeWith(Calendar startTimeInstant)
Например, длительность в один месяц нормализуется до 31 дня, если в качестве начального момента времени задано «8 июля 2003 г., 17:40:32».
Формально вычисление выполняется следующим образом:
- заданный объект Calendar клонируется
- поля лет, месяцев и дней добавляются к объекту
Calendarс помощью методаCalendar.add(int,int) - разность между двумя объектами Calendar вычисляется в миллисекундах и преобразуется в дни; если из-за перехода на летнее время возникает остаток, он отбрасывается
- вычисленное количество дней вместе с полями часов, минут и секунд этого объекта Duration используется для создания нового объекта 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.
Обратите внимание, что бывают случаи, когда две Duration несопоставимы друг с другом, например один месяц и 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.
https://docs.oracle.com/en/java/javase/25/docs/api/java.xml/javax/xml/datatype/Duration.html