Класс 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.
- Since:
- 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() |
Получает значение 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- Если комбинация установленных полей не соответствует одному из типов данных XML Schema date/time.
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)
Если поле секунд содержит больше цифр, чем порядок миллисекунд, они просто отбрасываются (или, другими словами, округляются до нуля.) Например, для любого значения 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. В случае с годами, месяцами, днями, часами и минутами возвращаемое число будет неотрицательным целым числом. В случае со секундами возвращаемое число может быть неотрицательным десятичным значением.- Параметры:
-
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- одна из шести констант поля (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.
Формально, вычисление определяется следующим образом.
Во-первых, мы можем предположить, что две 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, не равный null и действительный.
- Throws:
-
NullPointerException- Если параметр rhs равен null. -
IllegalStateException- Если две продолжительности не могут быть осмысленно сложены. Например, добавление минус одного дня к одному месяцу вызывает эту ошибку. - See Also:
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", то 1 добавляется к SECONDS, 234 добавляется к MILLISECONDS, а остальное игнорируется.
Обратите внимание, что так как 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раз больше новой продолжительности. - 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) для удаления полей years и months.
- Parameters:
-
factor- на что умножать - Returns:
- возвращает не равный null и действительный объект
Duration - Throws:
-
IllegalStateException- если операция производит дробь в поле месяца. -
NullPointerException- если параметрfactorравенnull.
negate
public abstract Duration negate()
Duration, значение которого равно -this. Поскольку класс Duration неизменяемый, этот метод не изменяет значение этого объекта. Он просто вычисляет новый объект Duration и возвращает его.
- Returns:
- всегда возвращает не равный null и действительный объект
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 Part 2, Section 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
public abstract int hashCode()
- Overrides:
-
hashCodeв классеObject - Returns:
- значение хэш-кода для этого объекта.
- See Also:
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)
- Overrides:
-
toStringв классеObject - Returns:
- Недопустимое строковое представление этого объекта
Duration.
© 1993, 2023, 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/21/docs/api/java.xml/javax/xml/datatype/Duration.html