- java.lang.Object
-
- javax.xml.datatype.Duration
-
public abstract class Duration extends Object
W3C XML Schema 1.0规范中定义的时间跨度的不可变表示。
持续时间对象表示公历时间,由六个字段(年,月,日,小时,分钟和秒)加上一个符号(+/-)字段组成。
前五个字段具有非负(> = 0)整数或空(表示未设置字段),秒字段具有非负数十进制或零。 负号表示负持续时间。
该类提供了许多方法,使其易于使用具有勘误的XML Schema 1.0的持续时间数据类型。
订单关系
持续时间对象只有部分顺序,其中两个值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)
方法。持续时间操作
该类提供了一组基本的算术运算,如加法,减法和乘法。 因为持续时间没有完整的顺序,所以操作的某些组合可能会失败。 例如,您不能从1个月内减去15天。 有关这些可能发生的详细情况,请参阅这些方法的javadoc。
另外,由于
Duration
类只能处理有限精度十进制数,所以不提供持续时间Duration
。 例如,不能代表1秒除以3。但是,您可以用乘数乘以3除以0.3或0.333。
允许值范围
由于
Duration
一些操作依赖于Calendar
,即使Duration
可以容纳非常大或非常小的值,某些方法可能无法在这样的Duration
上正常工作。 受影响的方法记录了它们对Calendar
的依赖。- 从以下版本开始:
- 1.5
- 另请参见:
-
XMLGregorianCalendar.add(Duration)
-
-
构造方法摘要
构造方法 Constructor 描述 Duration()
默认的无参数构造函数。
-
方法摘要
所有方法 接口方法 抽象方法 具体的方法 Modifier and Type 方法 描述 abstract Duration
add(Duration rhs)
计算值为this+rhs
的新持续时间。abstract void
addTo(Calendar calendar)
将此持续时间添加到Calendar
对象。void
addTo(Date date)
将此持续时间添加到Date
对象。abstract int
compare(Duration duration)
与Duration
实例的部分顺序关系比较。boolean
equals(Object duration)
检查此持续时间对象是否与另一个Duration
对象具有相同的持续时间。int
getDays()
获取DAYS字段的值作为整数值,如果不存在则取为0。abstract Number
getField(DatatypeConstants.Field field)
获取字段的值。int
getHours()
获取HOURS字段的值作为整数值,如果不存在,则为0。int
getMinutes()
获取MINUTES字段的值作为整数值,如果不存在,则为0。int
getMonths()
获取MONTHS字段的值作为整数值,如果不存在,则为0。int
getSeconds()
获取SECONDS字段的值作为整数值,如果不存在则取为0。abstract int
getSign()
以-1,0或1的形式返回此持续时间的符号。long
getTimeInMillis(Calendar startInstant)
以毫秒为单位返回持续时间的长度。long
getTimeInMillis(Date startInstant)
以毫秒为单位返回持续时间的长度。QName
getXMLSchemaType()
返回此实例映射到的XML模式日期/时间类型的名称。int
getYears()
如果不存在,请将此Duration
的年数值作为int
或0
。abstract int
hashCode()
返回与equals方法的定义一致的哈希码。boolean
isLongerThan(Duration duration)
检查此持续时间对象是否严格超过另一个Duration
对象。abstract boolean
isSet(DatatypeConstants.Field field)
检查是否设置了一个字段。boolean
isShorterThan(Duration duration)
检查此持续时间对象是否严格短于另一个Duration
对象。Duration
multiply(int factor)
计算一个新的持续时间,其值是该持续时间的值的factor
倍。abstract Duration
multiply(BigDecimal factor)
计算一个新的持续时间,其值是该持续时间的值的factor
倍。abstract Duration
negate()
返回值为-this
的新的Duration
对象。abstract Duration
normalizeWith(Calendar startTimeInstant)
通过使用特定的时刻作为参考点,将几个月和几个字段转换为日期字段。Duration
subtract(Duration rhs)
计算一个新的持续时间,值为this-rhs
。String
toString()
返回此Duration Object
的String
表示。
-
-
-
构造方法详细信息
-
Duration
public Duration()
默认的无参数构造函数。注意:始终使用
DatatypeFactory
构建一个Duration
的实例。 此类的构造函数无法保证产生一致状态的对象,并可能在将来被删除。
-
-
方法详细信息
-
getXMLSchemaType
public QName getXMLSchemaType()
返回此实例映射到的XML模式日期/时间类型的名称。 类型是基于设置的字段计算的,即isSet(DatatypeConstants.Field field)
==true
。 Required fields for XML Schema 1.0 Date/Time Datatypes.
(timezone is optional for all date/time datatypes) Datatype year month day hour minute secondDatatypeConstants.DURATION
X X X X X XDatatypeConstants.DURATION_DAYTIME
X X X XDatatypeConstants.DURATION_YEARMONTH
X X- 结果
-
以下常数之一:
DatatypeConstants.DURATION
,DatatypeConstants.DURATION_DAYTIME
或DatatypeConstants.DURATION_YEARMONTH
。 - 异常
-
IllegalStateException
- 如果设置字段的组合与其中一个XML模式日期/时间数据类型不匹配。
-
getSign
public abstract int getSign()
以-1,0或1的形式返回此持续时间的符号。- 结果
- -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()
获取MONTHS字段的值作为整数值,如果不存在,则为0。 此方法的工作方式与getYears()
类似,除了该方法适用于MONTHS字段。- 结果
-
这个月数
Duration
。
-
getDays
public int getDays()
获取DAYS字段的值作为整数值,如果不存在则取为0。 此方法的工作方式与getYears()
类似,除了该方法在DAYS字段上工作。- 结果
-
天
Duration
。
-
getHours
public int getHours()
获取HOURS字段的值作为整数值,如果不存在,则为0。 此方法的工作方式与getYears()
类似,只是该方法适用于HOURS字段。- 结果
-
这个小时
Duration
。
-
getMinutes
public int getMinutes()
获取MINUTES字段的值作为整数值,如果不存在,则为0。 此方法的工作方式与getYears()
类似,只是该方法适用于MINUTES字段。- 结果
-
这个
Duration
分钟。
-
getSeconds
public int getSeconds()
获取SECONDS字段的值作为整数值,如果不存在则取为0。 此方法的工作方式与getYears()
类似,只是该方法适用于SECONDS字段。- 结果
- 秒的整数值。 秒的分数将被丢弃(例如,如果实际值为2.5,则此方法返回2)
-
getTimeInMillis
public long getTimeInMillis(Calendar startInstant)
以毫秒为单位返回持续时间的长度。如果秒字段传输的数字比毫秒级数更多,那么这些数据将被简单地丢弃(或换句话说,四舍五入为零)。例如,对于任何日历值
x
,new Duration("PT10.00099S").getTimeInMills(x) == 10000
new Duration("-PT10.00099S").getTimeInMills(x) == -10000
请注意,此方法使用
addTo(Calendar)
方法,可能会在其字段中具有非常大的值的Duration
对象中正常工作。 有关详细信息,请参阅addTo(Calendar)
方法。- 参数
-
startInstant
- 一个月/年的长短有所不同。startInstant
用于消除这种差异的歧义。 具体来说,该方法返回startInstant
和startInstant+duration
之间的差异 - 结果
-
startInstant
和startInstant
之间的毫秒加上这个Duration
- 异常
-
NullPointerException
- 如果startInstant
参数为空。
-
getTimeInMillis
public long getTimeInMillis(Date startInstant)
以毫秒为单位返回持续时间的长度。如果秒字段的数字比毫秒级数更多,则这些数据将被简单地丢弃(或换句话说,舍入为零)。例如,对于任何
Date
值x
,new Duration("PT10.00099S").getTimeInMills(x) == 10000
new Duration("-PT10.00099S").getTimeInMills(x) == -10000
请注意,此方法使用
addTo(Date)
方法,这可能会在其字段中具有非常大的值的Duration
对象中正常工作。 有关详细信息,请参阅addTo(Date)
方法。- 参数
-
startInstant
- 一个月/年的长短有所不同。startInstant
用于消除这种差异的歧义。 具体来说,该方法返回startInstant
和startInstant+duration
之间的差异。 - 结果
-
startInstant
与startInstant
之间的毫秒startInstant
加上此Duration
- 异常
-
NullPointerException
- 如果startInstant参数为空。 - 另请参见:
-
getTimeInMillis(Calendar)
-
getField
public abstract Number getField(DatatypeConstants.Field field)
获取字段的值。 持续时间对象的字段可能包含任意大的值。 因此,此方法旨在返回一个Number
对象。 在YEARS,MONTHS,DAYS,HOURS和MINUTES的情况下,返回的数字将为非负整数。 在秒的情况下,返回的数字可能是非负十进制值。- 参数
-
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)。 - 结果
- 如果现场存在,则为真。 假如不是。
- 异常
-
NullPointerException
- 如果字段参数为空。
-
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.signum()*rhs.signum()!=-1
或它们都被归一化,则lhs.add(rhs)
将始终成功。- 参数
-
rhs
-Duration
加入这个Duration
- 结果
- 非空的有效持续时间对象。
- 异常
-
NullPointerException
- 如果rhs参数为空。 -
IllegalStateException
- 如果两个持续时间无法有意义地添加。 例如,将负一天添加到一个月会导致此异常。 - 另请参见:
-
subtract(Duration)
-
addTo
public abstract void addTo(Calendar calendar)
将此持续时间添加到Calendar
对象。如果这些字段存在,按照YEARS,MONTHS,DAYS,HOURS,MINUTES,SECONDS和MILLISECONDS的顺序拨打
Calendar.add(int,int)
。 因为Calendar
类使用int来保存值,所以存在这种方法不能正常工作的情况(例如,如果字段的值超过int的范围)另外,由于这个持续时间类是公历的时间长度,如果给定的
Calendar
对象基于某些其他日历系统,则此方法将无法正常工作。Duration
对象超过毫秒的任何小数部分将被忽略。 例如,如果此持续时间为“P1.23456S”,则将1添加到SECONDS,234添加到MILLISECONDS,其余将不被使用。需要注意的是,因为
Calendar.add(int, int)
是使用int
,Duration
与超出范围值int
在其领域会造成溢/下溢给定Calendar
。XMLGregorianCalendar.add(Duration)
提供与此方法相同的基本操作,同时避免溢出/下溢问题。- 参数
-
calendar
- 其值将被修改的日历对象。 - 异常
-
NullPointerException
- 如果日历参数为空。
-
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
中有一些操作失败的情况 。正式地计算如下。 首先,我们可以假设两个
Duration
都是正面的,而不会失去一般性。 (即,(-X)-Y=-(X+Y)
,X-(-Y)=X+Y
,(-X)-(-Y)=-(X-Y)
)然后逐字段减去两个持续时间。 如果任何非零字段
F
的符号与最高有效字段的符号不同,则1(如果为F
为负)或-1(否则)将从下一个较大的单元F
。重复此过程,直到所有非零字段具有相同的符号。
如果在日期领域发生借款(换句话说,如果计算需要借用1个月或-1个月来补偿日子),则计算失败,则抛出一个
IllegalStateException
。- 参数
-
rhs
-Duration
减去Duration
。 - 结果
-
新的
Duration
创建从这rhs
减去Duration
。 - 异常
-
IllegalStateException
- 如果不能有意义地减去两个持续时间。 例如,从一个月减去一天会导致此异常。 -
NullPointerException
- 如果rhs参数为空。 - 另请参见:
-
add(Duration)
-
multiply
public Duration multiply(int factor)
计算一个新的持续时间,其值是该持续时间的值的factor
倍。为方便起见,提供了这种方法。 它在功能上等同于以下代码:
multiply(new BigDecimal(String.valueOf(factor)))
- 参数
-
factor
- 创建新的Duration
因子倍数。 - 结果
-
新的
Duration
是factor
倍于这Duration
倍。 - 另请参见:
-
multiply(BigDecimal)
-
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()
返回值为-this
的新的Duration
对象。由于
Duration
类是不可变的,所以此方法不会更改此对象的值。 它只是计算一个新的Duration对象并返回它。- 结果
-
总是返回一个非空的有效
Duration
对象。
-
normalizeWith
public abstract Duration normalizeWith(Calendar startTimeInstant)
通过使用特定的时刻作为参考点,将几个月和几个字段转换为日期字段。例如,“开始时间”例如“2003年7月8日17:40:32”,一个月的持续时间正常化到31天。
正式地,计算完成如下:
- 给定的Calendar对象被克隆
- 年份,月份和日期字段将被添加到
Calendar
对象中使用Calendar.add(int,int)
方法 - 两个日历之间的差异以毫秒计算并转换为天数,如果由于夏令时间而发生余数,则它将被丢弃
- 计算的天数以及此持续时间对象的小时,分钟和秒字段用于构建新的“持续时间”对象。
请注意,由于Calendar类使用
int
来保存年份和月份的值,如果该持续时间对象在几个月或int
中保持非常大的值,则此方法可能会产生意外结果。- 参数
-
startTimeInstant
-Calendar
参考点。 - 结果
-
Duration
的这个Duration
几个月的日子。 - 异常
-
NullPointerException
- 如果startTimeInstant参数为空。
-
compare
public abstract int compare(Duration duration)
与这Duration
实例的部分顺序关系比较。比较结果必须符合W3C XML Schema 1.0 Part 2, Section 3.2.7.6.2, Order relation on duration 。
返回:
-
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
。 - 另请参见:
-
isShorterThan(Duration)
,isLongerThan(Duration)
-
-
isLongerThan
public boolean isLongerThan(Duration duration)
检查此持续时间对象是否严格超过另一个Duration
对象。当且仅当X> Y在XML Schema 1.0规范的3.2.6.2节定义时,X的持续时间X将比Y更长。
例如,“P1D”(一天)>“PT12H”(12小时)和“P2Y”(两年)>“P23M”(23个月)。
- 参数
-
duration
-Duration
以测试这Duration
对。 - 结果
- 如果此对象所表示的持续时间长于给定持续时间,则为true。 否则为假。
- 异常
-
UnsupportedOperationException
- 如果底层实现无法合理地处理请求,例如W3C XML Schema允许任意大/小/精确的值,则请求可能超出实现能力。 -
NullPointerException
- 如果duration
为空。 - 另请参见:
-
isShorterThan(Duration)
,compare(Duration duration)
-
isShorterThan
public boolean isShorterThan(Duration duration)
检查此持续时间对象是否严格短于另一个Duration
对象。- 参数
-
duration
-Duration
要测试这个Duration
对。 - 结果
-
true
如果duration
参数比这个Duration
短,否则是false
。 - 异常
-
UnsupportedOperationException
- 如果底层实现不能合理地处理请求,例如W3C XML Schema允许任意大/小/精确的值,则该请求可能超出实现能力。 -
NullPointerException
- 如果duration
为空。 - 另请参见:
-
isLongerThan(Duration duration)
,compare(Duration duration)
-
equals
public boolean equals(Object duration)
检查此持续时间对象是否与另一个Duration
对象具有相同的持续时间。例如,“P1D”(1天)等于“PT24H”(24小时)。
当且仅当时间t + X和t + Y对于XML Schema 1.0规范的3.2.6.2节中指定的所有测试时刻是相同的,持续时间X等于Y。
请注意,有两个
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允许任意大/小/精确的值,则该请求可能超出实现能力。 - 另请参见:
-
compare(Duration duration)
-
hashCode
public abstract int hashCode()
返回与equals方法的定义一致的哈希码。- 重写:
-
hashCode
在Object
- 结果
- 该对象的哈希码值。
- 另请参见:
-
Object.hashCode()
-
toString
public String toString()
返回此Duration Object
的String
表示。结果根据XML Schema 1.0规范进行格式化,并且可以随时解析为
Duration Object
(DatatypeFactory.newDuration(String lexicalRepresentation)
) 。正式地,以下适用于任何
Duration
Object
x:new Duration(x.toString()).equals(x)
-
-