从 joda Duration 中减去/增加时间

Luc*_*old 6 java time duration date jodatime

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

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

就像是:

new Duration(startTime, endTime).minusDays(2);
Run Code Online (Sandbox Code Playgroud)

Bas*_*que 6

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.
)
Run Code Online (Sandbox Code Playgroud)

最好迁移到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.
)
Run Code Online (Sandbox Code Playgroud)

没有这样的日子

持续时间(开始时间,结束时间)。减天(2)

DurationJoda-Time 中的A表示毫秒数。这个时间跨度没有附加到时间线。所以没有“天”的概念。

引用文档

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

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

因此,虽然您不能添加/减去days,但您可以添加/减去通用一天的 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 ) ;
Run Code Online (Sandbox Code Playgroud)

Duration课程为这项工作提供了一种捷径,即静态方法Duration.standardDays,其中“标准”意味着与日历无关的通用 24 小时时间段。

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

添加。

Duration d = myDuration.plus( twoGenericDays ) ;
Run Code Online (Sandbox Code Playgroud)

减去。

Duration d = myDuration.minus( twoGenericDays ) ;
Run Code Online (Sandbox Code Playgroud)

时间

乔达时间项目现在处于维护模式,并建议迁移到它的后继者,java.time类。

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

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

添加。

Duration d = myDuration.plus( twoGenericDays ) ;
Run Code Online (Sandbox Code Playgroud)

减去。

Duration d = myDuration.minus( twoGenericDays ) ;
Run Code Online (Sandbox Code Playgroud)

与 Joda-Time 一样,java.time类建立在不可变对象模式上。不是改变(“变异”)一个对象,而是实例化一个新的单独对象。


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了麻烦的旧的遗留日期时间类,例如java.util.Date, Calendar, & SimpleDateFormat

现在处于维护模式Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle 教程。并在 Stack Overflow 上搜索许多示例和解释。规范是JSR 310

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

从哪里获得 java.time 类?

ThreeTen-额外项目与其他类扩展java.time。该项目是未来可能添加到 java.time 的试验场。你可能在这里找到一些有用的类,比如IntervalYearWeekYearQuarter,和更多