【问题标题】:subtracting / adding time from joda Duration从 joda Duration 中减去/添加时间
【发布时间】:2018-11-21 03:18:05
【问题描述】:

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

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

类似:

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

【问题讨论】:

标签: java date time jodatime duration


【解决方案1】:

tl;博士

Joda-Time 提供方法 Duration::plusDuration::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 表示毫秒数。此时间跨度未附加到时间线。所以没有“天”的概念。

引用the documentation:

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

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

因此,虽然您不能添加/减去 ,但您可以添加/减去毫秒数,即一般一天的 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 ) ;

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

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

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

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

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案2】:

    巧妙地使用 API 调用(例如使用 Duration#withDurationAdded),似乎您可以从 Duration 中减去一天,只要它是“标准”天(86,400 秒)一天内),只要您将标量运算设置为负数。

    new Duration(start, end).withDurationAdded(Duration.standardDays(1), -1);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-03
      • 1970-01-01
      相关资源
      最近更新 更多