例如,我知道joda的DateTime类中的.minusDays(int)
和.plus(int)
方法。
但是当我使用joda Duration
时,没有特定的时间点,是否有一种简单而好的方式来减去或添加特定的时间,比如一天?
类似的东西:
new Duration(startTime, endTime).minusDays(2);
答案 0 :(得分:4)
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
表示毫秒数。这段时间没有附加到时间轴上。所以没有“天”的概念。
指定时间长度的不可变持续时间(以毫秒为单位)。
持续时间由固定的毫秒数定义。没有字段的概念,例如天或秒,因为这些字段的长度可能不同。
因此,虽然您无法添加/减去天,但您可以添加/减去毫秒数是一般日期的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 ) ;
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 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。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。
答案 1 :(得分:1)
熟悉API调用(例如使用Duration#withDurationAdded
), ,您可以从Duration
减去一天,只要它是' sa "标准"一天(一天86,400秒),只要你设置标量操作为负。
new Duration(start, end).withDurationAdded(Duration.standardDays(1), -1);