public abstract class Duration extends Object
W3C XML Schema 1.0规范中定义的时间跨度的不可变表示。
持续时间对象表示公历时间,由六个字段(年,月,日,小时,分钟和秒)加上一个符号(+/-)字段组成。
前五个字段具有非负(> = 0)整数或空(表示未设置字段),秒字段具有非负数十进制或零。 负号表示负持续时间。
该类提供了许多方法,使其易于使用具有勘误的XML Schema 1.0的持续时间数据类型。
持续时间对象只有部分顺序,其中两个值A和B可能是:
例如,30天不能与一个月相比有意义。 compare(Duration duration)
方法实现了这种关系。
有关Duration
对象之间的顺序关系的详细信息,请参阅isLongerThan(Duration)
方法。
该类提供了一组基本的算术运算,如加法,减法和乘法。 因为持续时间没有完整的顺序,所以操作的某些组合可能会失败。 例如,您不能从1个月内减去15天。 有关这些可能发生的详细情况,请参阅这些方法的javadoc。
另外,由于Duration
类只能处理有限精度的十进制数,所以不提供持续时间除数。 例如,不能代表1秒除以3。
但是,您可以用乘数乘以3除以0.3或0.333。
由于一些操作Duration
依靠Calendar
尽管Duration
可以容纳非常大或非常小的值,某些方法可能无法正常在这样的工作Duration
秒。 受影响的方法记录了他们对Calendar
的依赖 。
XMLGregorianCalendar.add(Duration)
Constructor and Description |
---|
Duration()
默认的无参数构造函数。
|
Modifier and Type | Method and Description |
---|---|
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 对象。
|
abstract Duration |
multiply(BigDecimal factor)
计算一个新的持续时间,其值是该持续时间的值的
factor 倍。
|
Duration |
multiply(int factor)
计算一个新的持续时间,其值是该持续时间的值的
factor 倍。
|
abstract Duration |
negate()
返回值为
-this 的新的
Duration 对象。
|
abstract Duration |
normalizeWith(Calendar startTimeInstant)
通过使用特定的时刻作为参考点,将几个月和几个字段转换为日期字段。
|
Duration |
subtract(Duration rhs)
计算值为
this-rhs 的新持续时间。
|
String |
toString()
返回此
String Object的
Duration
Object 。
|
public Duration()
注意:始终使用DatatypeFactory
构造的一个实例Duration
。 此类的构造函数无法保证产生一致状态的对象,并可能在将来被删除。
public QName getXMLSchemaType()
返回此实例映射到的XML模式日期/时间类型的名称。 类型是基于设置的字段计算的,即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模式日期/时间数据类型之一不匹配。
public abstract int getSign()
public int getYears()
如果不存在,请将此Duration
的年份值作为int
或0
。
getYears()
为方便方法getField(DatatypeConstants.YEARS)
。
由于返回值是int
,不正确的值将被退回Duration
多年超越的的范围S int
。 使用getField(DatatypeConstants.YEARS)
避免可能的精度损失。
int
,否则返回
0
。
public int getMonths()
getYears()
,除了该方法适用于MONTHS字段。
Duration
。
public int getDays()
getYears()
,除了该方法在DAYS字段上工作。
Duration
。
public int getHours()
getYears()
类似,除了该方法适用于HOURS字段。
Duration
。
public int getMinutes()
getYears()
,除了该方法适用于MINUTES字段。
Duration
分钟。
public int getSeconds()
getYears()
类似,除了该方法适用于SECONDS字段。
public long getTimeInMillis(Calendar startInstant)
以毫秒为单位返回持续时间的长度。
如果秒字段的数字比毫秒级数更多,那么它们将被简单地丢弃(或换句话说,四舍五入为零)。例如,对于任何Calendar值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+duration
startInstant
和
startInstant
加上这个
Duration
NullPointerException
- 如果
startInstant
参数为空。
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+duration
。
startInstant
和
startInstant
加上这个
Duration
NullPointerException
- 如果startInstant参数为空。
getTimeInMillis(Calendar)
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
。
public abstract boolean isSet(DatatypeConstants.Field field)
field
- 六个字段常量之一(YEARS,MONTHS,DAYS,HOURS,MINUTES或SECONDS)。
NullPointerException
- 如果字段参数为空。
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
s被简单地定义为字段添加,其中缺少的字段被视为0。
所得的场Duration
当且仅当两个输入相应字段将被取消设置Duration
s为未设定。
请注意, lhs.add(rhs)
将始终成功,如果lhs.signum()*rhs.signum()!=-1
或它们都被归一化。
rhs
-
Duration
加入这个
Duration
NullPointerException
- 如果rhs参数为空。
IllegalStateException
- 如果两个持续时间无法有意义地添加。
例如,将负一天添加到一个月会导致此异常。
subtract(Duration)
public abstract void addTo(Calendar calendar)
Calendar
对象。
电话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
- 如果日历参数为空。
public void addTo(Date date)
Date
对象。
给定日期首先转换为GregorianCalendar
,则持续时间与addTo(Calendar)
方法完全相同。
然后更新的时刻转换回Date
对象,并用于更新给定的Date
对象。
这个有点冗余的计算是明确确定月和年的持续时间所必需的。
date
- 值将被修改的日期对象。
NullPointerException
- 如果date参数为null。
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)
public Duration multiply(int factor)
计算一个新的持续时间,其值比此持续时间的值高factor
倍。
为方便起见,提供了这种方法。 它在功能上等同于以下代码:
multiply(new BigDecimal(String.valueOf(factor)))
factor
- 创建新的
Duration
因子倍数。
Duration
这是
factor
倍于这
Duration
倍。
multiply(BigDecimal)
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
。
public abstract Duration negate()
-this
的新的Duration
对象。
由于Duration
类是不可变的,所以此方法不会更改此对象的值。 它只是计算一个新的Duration对象并返回它。
Duration
对象。
public abstract Duration normalizeWith(Calendar startTimeInstant)
通过使用特定的时刻作为参考点,将几个月和几个字段转换为日期字段。
例如,“开始时间”例如“2003年7月8日17:40:32”,一个月的持续时间正常化到31天。
正式地,计算完成如下:
Calendar
对象中使用Calendar.add(int,int)
方法 请注意,由于Calendar类使用int
来保存年份和月份的值,因此如果该持续时间对象在几个月或几个字段中保持非常大的值,则此方法可能会产生意外结果。
startTimeInstant
-
Calendar
参考点。
Duration
的这个
Duration
几个月的日子。
NullPointerException
- 如果startTimeInstant参数为空。
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)
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
对。
UnsupportedOperationException
- 如果底层实现不能合理地处理请求,例如,W3C XML Schema允许任意大/小/精确的值,请求可能超出实现能力。
NullPointerException
- 如果
duration
为空。
isShorterThan(Duration)
,
compare(Duration duration)
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)
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)
public abstract int hashCode()
hashCode
在
Object
Object.hashCode()
public String toString()
返回此String
Object的Duration
Object
。
结果根据XML Schema 1.0规范进行格式化,并且可以随时解析为等效的Duration
Object
by DatatypeFactory.newDuration(String lexicalRepresentation)
。
正式地,以下适用于任何Duration
Object
x:
new Duration(x.toString()).equals(x)