从joda持续时间减去/增加时间

时间:2018-06-11 19:51:12

标签: java date time jodatime duration

例如,我知道joda的DateTime类中的.minusDays(int).plus(int)方法。

但是当我使用joda Duration时,没有特定的时间点,是否有一种简单而好的方式来减去或添加特定的时间,比如一天?

类似的东西:

new Duration(startTime, endTime).minusDays(2);

2 个答案:

答案 0 :(得分:4)

TL;博士

Joda-Time 提供方法Duration::plus& Duration::minus

myDuration.minus(                // A span of time unattached to the timeline. Consists of a number of milliseconds.
    Duration.standardDays( 2 )   // Generic 24-hour days.
)

最好迁移到 java.time

myDuration.minus(                // A span of time unattached to the timeline. Consists of a number of whole seconds plus a number of nanoseconds.
    Duration.ofDays( 2 )         // Generic 24-hour days.
)

没有

  

持续时间(startTime,endTime).minusDays(2)

Joda-Time中的Duration表示毫秒数。这段时间没有附加到时间轴上。所以没有“天”的概念。

引用the documentation

  

指定时间长度的不可变持续时间(以毫秒为单位)。

     

持续时间由固定的毫秒数定义。没有字段的概念,例如天或秒,因为这些字段的长度可能不同。

因此,虽然您无法添加/减去,但您可以添加/减去毫秒数是一般日期的24小时,而不考虑日历问题而不考虑夏令时(DST)等异常。

使用java.util.concurrent.TimeUnit枚举来计算该毫秒数。

long millis = TimeUnit.DAYS.toMilliseconds( 2 ) ; // 2 days of 24 hours * 60 minutes per hour * 60 seconds per minute * 1,000 milliseconds per second.

Duration twoGenericDays = Duration.millis( millis ) ;

Duration类提供了该工作的快捷方式,即静态方法Duration.standardDays,其中“标准”表示与日历无关的24小时通用时间。

Duration twoGenericDays = Duration.standardDays( 2 ) ;  // Two generic 24-hour days, unrelated to the calendar.

添加。

Duration d = myDuration.plus( twoGenericDays ) ;

减去。

Duration d = myDuration.minus( twoGenericDays ) ;

java.time

Joda-Time 项目现在处于维护模式,并建议迁移到其后续版本 java.time 类。

与上面讨论的概念相同,其中java.time.Duration表示未附加到时间线的时间跨度。除了分辨率更精细:nanoseconds而不是milliseconds。从技术上讲,Duration由(a)整数秒和(b)构成小数秒的纳秒数组成。

Duration twoGenericDays = Duration.ofDays( 2 ) ;  // Two generic days, each being a 24 hours long.

添加。

Duration d = myDuration.plus( twoGenericDays ) ;

减去。

Duration d = myDuration.minus( twoGenericDays ) ;

与Joda-Time一样, java.time 类基于immutable objects模式构建。不是改变(“改变”)一个对象,而是实例化一个新的独立对象。

关于 java.time

java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance mode项目建议迁移到java.time类。

要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore

答案 1 :(得分:1)

熟悉API调用(例如使用Duration#withDurationAdded), ,您可以从Duration减去一天,只要它是' sa "标准"一天(一天86,400秒),只要你设置标量操作为负。

new Duration(start, end).withDurationAdded(Duration.standardDays(1), -1);