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()
              返回此 
              StringObject的DurationObject。 | 
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)  
           Submit a bug or feature 
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
 Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.