Класс 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) реализует это отношение.
См. метод isLongerThan(Duration) для получения подробностей об отношении порядка между Duration объектами.
Операции над Duration
Этот класс предоставляет набор основных арифметических операций, таких как сложение, вычитание и умножение. Поскольку продолжительности не имеют полного порядка, операция может завершиться неудачей для некоторых комбинаций операций. Например, нельзя вычесть 15 дней из 1 месяца. См. JavaDoc этих методов для подробных условий, в которых это может произойти.
Также не предусмотрено деление продолжительности на число, так как класс 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 date/time, которому соответствует этот экземпляр. |
int |
getYears() |
Получает значение years этого 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 |
Преобразует поля years и months в поле days, используя конкретный момент времени в качестве точки отсчета. |
Duration |
subtract |
Вычисляет новую продолжительность, значение которой равно this-rhs. |
String |
toString() |
Возвращает представление String этого Duration Object. |
Подробное описание конструкторов
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- Если сочетание установленных полей не соответствует одному из типов данных date/time XML Schema.
getSign
public abstract int getSign()
- Возвращает:
- -1, если продолжительность отрицательная, 0, если продолжительность равна нулю, и 1, если продолжительность положительная.
getYears
public int getYears()
Duration как int или 0, если оно отсутствует. getYears() — это метод для удобства работы с getField(DatatypeConstants.YEARS).
Поскольку возвращаемое значение является int, некорректное значение будет возвращено для Duration с годами, выходящими за пределы диапазона int. Используйте getField(DatatypeConstants.YEARS), чтобы избежать возможной потери точности.
- Возвращает:
- Если поле лет присутствует, возвращает его значение как
int, иначе возвращает0.
getMonths
public int getMonths()
getYears(), за исключением того, что этот метод работает с полем МЕСЯЦЫ.- Возвращает:
- Месяцы этой
Duration.
getDays
public int getDays()
getYears(), за исключением того, что этот метод работает с полем ДНИ.- Возвращает:
- Дни этой
Duration.
getHours
public int getHours()
getYears(), за исключением того, что этот метод работает с полем ЧАСЫ.- Возвращает:
- Часы этой
Duration.
getMinutes
public int getMinutes()
getYears(), за исключением того, что этот метод работает с полем МИНУТЫ.- Возвращает:
- Минуты этой
Duration.
getSeconds
public int getSeconds()
getYears(), за исключением того, что этот метод работает с полем СЕКУНДЫ.- Возвращает:
- секунды в целом значении. Дробная часть секунд будет отброшена (например, если фактическое значение 2,5, этот метод возвращает 2)
getTimeInMillis
public long getTimeInMillis(Calendar startInstant)
Если поле секунд содержит больше цифр, чем порядок миллисекунд, они будут просто отброшены (или, другими словами, округлятся до нуля.) Например, для любого значения календаря 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. В случае ЛЕТ, МЕСЯЦЕВ, ДНЕЙ, ЧАСОВ и МИНУТ возвращаемое число будет неотрицательным целым числом. В случае секунд возвращаемое число может быть неотрицательным десятичным значением.- Параметры:
-
field- одна из шести констант поля (ЛЕТА, МЕСЯЦЫ, ДНИ, ЧАСЫ, МИНУТЫ или СЕКУНДЫ.) - Возвращает:
- Если указанное поле присутствует, этот метод возвращает непустой неотрицательный объект
Number, представляющий его значение. Если он отсутствует, возвращается null. Для ЛЕТ, МЕСЯЦЕВ, ДНЕЙ, ЧАСОВ и МИНУТ этот метод возвращает объектBigInteger. Для СЕКУНД этот метод возвращает объектBigDecimal. - Выбрасывает:
-
NullPointerException- Если полеfieldявляетсяnull.
isSet
public abstract boolean isSet(DatatypeConstants.Field field)
- Параметры:
-
field- одна из шести констант поля (ЛЕТА, МЕСЯЦЫ, ДНИ, ЧАСЫ, МИНУТЫ или СЕКУНДЫ.) - Возвращает:
- true, если поле присутствует. false, если нет.
- Выбрасывает:
-
NullPointerException- Если параметр поля равен 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.
Формально вычисление определяется следующим образом.
Во-первых, можно предположить, что две складываемые Duration положительны без потери общности (т.е., (-X)+Y=Y-X, X+(-Y)=X-Y, (-X)+(-Y)=-(X+Y))
Сложение двух положительных Duration определяется просто как сложение по полям, при этом отсутствующие поля обрабатываются как 0.
Поле результирующей Duration будет сброшено тогда и только тогда, когда соответствующие поля двух входных Duration сброшены.
Обратите внимание, что lhs.add(rhs) всегда выполняется успешно, если lhs.signum()*rhs.signum()!=-1 или оба из них нормализованы.
- Parameters:
-
rhs-Duration, добавляемое к этомуDuration - Returns:
- непустой допустимый объект Duration.
- Throws:
-
NullPointerException- Если параметр rhs равен null. -
IllegalStateException- Если две продолжительности не могут быть осмысленно сложены. Например, добавление минус одного дня к одному месяцу приводит к этой ошибке. - See Also:
addTo
public abstract void addTo(Calendar calendar)
Calendar. Вызывает Calendar.add(int,int) в порядке ЛЕТ, МЕСЯЦЕВ, ДНЕЙ, ЧАСОВ, МИНУТ, СЕКУНД и МИЛЛИСЕКУНД, если эти поля присутствуют. Поскольку класс Calendar использует int для хранения значений, в некоторых случаях этот метод не будет работать правильно (например, если значения полей превышают диапазон int).
Кроме того, поскольку этот класс продолжительности — это продолжительность григорианского календаря, этот метод не будет работать правильно, если заданный объект Calendar основан на других системах календарей.
Любые дробные части этого объекта Duration за пределами миллисекунд будут просто проигнорированы. Например, если эта продолжительность равна "P1.23456S", то к СЕКУНДАМ добавляется 1, к МИЛЛИСЕКУНДАМ — 234, а остальное будет неиспользовано.
Обратите внимание, что так как Calendar.add(int, int) использует int, Duration со значениями за пределами диапазона int в его полях приведет к переполнению/обнулению заданного объекта Calendar. XMLGregorianCalendar.add(Duration) предоставляет ту же базовую операцию, что и этот метод, но избегает проблем с переполнением/обнулением.
- Parameters:
-
calendar- Объект календаря, значение которого будет изменено. - Throws:
-
NullPointerException- если параметр calendar равен null.
addTo
public void addTo(Date date)
Date. Заданная дата сначала преобразуется в GregorianCalendar, затем продолжительность добавляется точно так же, как в методе addTo(Calendar).
Обновленная временная метка затем преобразуется обратно в объект Date и используется для обновления заданного объекта Date.
Это несколько избыточное вычисление необходимо для однозначного определения продолжительности месяцев и лет.
- Parameters:
-
date- Объект даты, значение которого будет изменено. - Throws:
-
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.
Формально вычисление определяется следующим образом. Сначала можно предположить, что две Duration положительны без потери общности. (т.е., (-X)-Y=-(X+Y), X-(-Y)=X+Y, (-X)-(-Y)=-(X-Y))
Затем две продолжительности вычитаются по полю. Если знак любого ненулевого поля F отличается от знака самого значимого поля, 1 (если F отрицательное) или -1 (в противном случае) берётся взаймы из следующей большей единицы F.
Этот процесс повторяется до тех пор, пока все ненулевые поля не будут иметь одинаковый знак.
Если заём происходит в поле дней (другими словами, если вычисление должно занять 1 или -1 месяц для компенсации дней), то вычисление завершается ошибкой, сбрасывая IllegalStateException.
- Parameters:
-
rhs-Duration, вычитаемое из этогоDuration. - Returns:
- Новый
Duration, созданный путем вычитанияrhsиз этогоDuration. - Throws:
-
IllegalStateException- Если две продолжительности не могут быть осмысленно вычтены. Например, вычитание одного дня из одного месяца приводит к этой ошибке. -
NullPointerException- Если параметр rhs равен null. - See Also:
multiply
public Duration multiply(int factor)
factor раз больше значения этой продолжительности. Этот метод предоставляется для удобства. Он функционально эквивалентен следующему коду:
multiply(new BigDecimal(String.valueOf(factor)))
- Parameters:
-
factor- Множитель, вDurationраз больше новогоDuration. - Returns:
- Новый
Duration, который вfactorраз больше этогоDuration. - See Also:
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) для удаления полей лет и месяцев.
- Parameters:
-
factor- на что умножить - Returns:
- возвращает непустой допустимый объект
Duration - Throws:
-
IllegalStateException- если операция производит дробь в поле месяцев. -
NullPointerException- если параметрfactorравенnull.
negate
public abstract Duration negate()
Duration, значение которого равно -this. Поскольку класс Duration неизменяемый, этот метод не изменяет значение этого объекта. Он просто вычисляет новый объект Duration и возвращает его.
- Returns:
- всегда возвращает непустой допустимый объект
Duration.
normalizeWith
public abstract Duration normalizeWith(Calendar startTimeInstant)
Например, продолжительность одного месяца нормализуется до 31 дня, учитывая начальную точку времени "8 июля 2003 г., 17:40:32".
Формально, вычисление выполняется следующим образом:
- указанный объект Calendar клонируется
- поля года, месяца и дня добавляются к объекту
Calendar, используя методCalendar.add(int,int) - разница между двумя объектами Calendar вычисляется в миллисекундах и преобразуется в дни, если остаток возникает из-за перехода на летнее/зимнее время, он отбрасывается
- вычисленные дни, а также поля часов, минут и секунд этого объекта Duration используются для построения нового объекта Duration.
Обратите внимание, что поскольку класс Calendar использует int для хранения значения года и месяца, этот метод может давать неожиданные результаты, если этот объект Duration содержит очень большое значение в полях года или месяца.
- Parameters:
-
startTimeInstant-Calendarточка отсчета. - Returns:
-
Durationгода и месяцев этогоDurationв днях. - Throws:
-
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, если нельзя определить заключительное отношение частичного порядка
- Parameters:
-
duration- для сравнения - Returns:
- отношение между
this Durationи параметромdurationкакDatatypeConstants.LESSER,DatatypeConstants.EQUAL,DatatypeConstants.GREATERилиDatatypeConstants.INDETERMINATE. - Throws:
-
UnsupportedOperationException- Если реализация не может разумно обработать запрос, например, W3C XML Schema допускает произвольно большие/малые/точни значения, запрос может быть вне возможностей реализации. -
NullPointerException- еслиdurationявляетсяnull. - See Also:
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 месяца).
- Parameters:
-
duration-Duration, с которым необходимо проверить этотDuration. - Returns:
- true, если продолжительность, представленная этим объектом, длиннее заданной продолжительности. false в противном случае.
- Throws:
-
UnsupportedOperationException- Если реализация не может разумно обработать запрос, например, W3C XML Schema допускает произвольно большие/малые/точни значения, запрос может быть вне возможностей реализации. -
NullPointerException- Еслиdurationравно null. - See Also:
isShorterThan
public boolean isShorterThan(Duration duration)
Duration.- Parameters:
-
duration-Duration, с которым необходимо проверить этотDuration. - Returns:
-
true, если параметрdurationкороче, чем этотDuration, в противном случаеfalse. - Throws:
-
UnsupportedOperationException- Если реализация не может разумно обработать запрос, например, W3C XML Schema допускает произвольно большие/малые/точни значения, запрос может быть вне возможностей реализации. -
NullPointerException- еслиdurationравно null. - See Also:
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"))
- Overrides:
-
equalsв классеObject - Parameters:
-
duration- Объект для сравнения с этим объектомDuration. - Returns:
-
true, если продолжительность этого объекта такая же, как уduration.false, еслиdurationравен null, не является объектомDurationили его продолжительность отличается от этой продолжительности. - Throws:
-
UnsupportedOperationException- Если реализация не может разумно обработать запрос, например, W3C XML Schema допускает произвольно большие/малые/точни значения, запрос может быть вне возможностей реализации. - See Also:
hashCode
toString
public String toString()
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://download.java.net/java/early_access/jdk24/docs/api/java.xml/javax/xml/datatype/Duration.html