例如,我知道 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
表示毫秒数。这个时间跨度没有附在时间轴上。所以没有“天”的概念。
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 类?
- Java SE 8 , Java SE 9 , Java SE 10 , 然后
- 内置。
- 带有捆绑实现的标准 Java API 的一部分。
- Java 9 添加了一些次要功能和修复。
- Java SE 6和 Java SE 7
- 许多 java.time 功能在 ThreeTen-Backport 中被反向移植到 Java 6 和 7 .
- Android
- 更高版本的 Android 捆绑了 java.time 类的实现。
- 对于早期的 Android (<26),ThreeTenABP项目改编ThreeTen-Backport (上文提到的)。参见 How to use ThreeTenABP… .
ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval
, YearWeek
, YearQuarter
, 和 more .
关于java - 从 joda Duration 中减去/增加时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50805074/