java - 从 joda Duration 中减去/增加时间

标签 java date time jodatime duration

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

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

类似于:

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

最佳答案

tl;dr

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.
)

没有这样的事情

Duration(startTime, endTime).minusDays(2)

Joda-Time 中的 Duration 表示毫秒数。这个时间跨度没有附在时间轴上。所以没有“天”的概念。

引用the documentation :

An immutable duration specifying a length of time in milliseconds.

A duration is defined by a fixed number of milliseconds. There is no concept of fields, such as days or seconds, as these fields can vary in length.

因此,虽然您不能添加/减去,但您可以添加/减去毫秒数,即通用一天的 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 小时时间 block 。

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.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

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

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于java - 从 joda Duration 中减去/增加时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805074/

相关文章:

java - 状态栏,如何使我的线条、椭圆和矩形可见?

java - 一个标签库可以被多个uri引用吗?

sql-server - 获取多行的天数

javascript - 如何在 javascript 中获取上一小时、上个月和昨天?

Java - 将字符串变量转换为日期+以 MM/dd/yyyy 格式获取今天的日期

r - 估计 R 执行时间

parsing - 如何从Haskell中的字符串解析UTCTime类型的时间值?

C - 以微秒精度在几秒钟内为我的程序计时

Java - 数组被无缘无故地改变

java - 如何连接到需要 Spring Security 表单例份验证 (Java) 的远程 URL?