例如,我知道joda的DateTime类中的.minusDays(int)和.plus(int)方法.
但是当我使用joda持续时间时,没有特定的时间点,是否有一种简单而好的方法来减去或添加特定的时间,比如一天?
就像是:
new Duration(startTime, endTime).minusDays(2);
解决方法:
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.
)
没有天
Duration(startTime, endTime).minusDays(2)
Joda-Time中的持续时间表示毫秒数.这段时间没有附加到时间轴上.所以没有“天”的概念.
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,其中“standard”表示与日历无关的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.技术上,持续时间包括(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 4.2或更高版本的JDBC driver.不需要字符串,不需要java.sql.*类.
从哪里获取java.time类?
> Java SE 8,Java SE 9,Java SE 10及更高版本
>内置.
>部分标准Java API,带有捆绑实现.
> Java 9增加了一些小功能和修复.
>大部分java.time功能都被反向移植到Java 6& 7月0700.
> Android
>更新版本的Android捆绑java.time类的实现.
>对于早期的Android(< 26),ThreeTenABP项目适应ThreeTen-Backport(如上所述).见How to use ThreeTenABP….
ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more.