1

我正在寻找一种通用模式来分解一些常见代码:我需要在具有不同属性和不同算术的类之间实现代数加法和减法。一个经典案例是可以用秒、小时和分钟表示的间隔,我用一个具有三个 int 属性的类来实现它。

例如,如果我想将 0 秒、0 分钟和 1 小时的周期减去 0 秒、30 分钟、0 小时的周期,我不想获得 0 秒、-30 分钟和 1 的周期小时。

我需要在两个时间间隔之间编码加减法,是否有任何通用模式来编码这个代数?我应该寻找不同的代表吗?

更新

我过度简化了这个问题,因为我的用例通常适用于以年、月、日和它们的组合表示的时间段。困难在于用户根据天、月、年进行思考,并且不可能进行精确的转换(一个月有多少天?嗯......这会有所不同)

所以用户知道他想在 6M 3 天内计算一些东西,当计算发生时,我会将该间隔应用于参考日期,得到正确的结果。我无法在总天数内转换 6M 3D,因为这取决于您选择的参考日期,并且会随着时间的推移而变化。

4

2 回答 2

2

对于这个特定的用例,您可能想看看scala-time

这是其 README 的摘录,显示了您可以使用的语法:

(2.hours + 45.minutes + 10.seconds).millis
returns Long = 9910000
于 2013-05-27T08:28:34.880 回答
1

如果您想要的是“标准化”显示,即最大小时数,然后是最大分钟数,然后是最大秒数,我只需将持续时间存储为秒数,然后计算每次要格式化持续时间时,它包含的小时/分钟/秒:

private int durationInSeconds;

public int getHours() {
    return durationInSeconds / (60 * 60);
} 

public int getMinutes() {
    return (durationInSeconds % (60 * 60)) / 60;
}

public int getSeconds() {
    return durationInSeconds % 60;
}

public void subtract(Duration duration) {
    if (duration.durationInSeconds > this.durationInSeconds) {
        throw new IllegalArgumentException("can't handle negative durations")
    }
    this.durationInSeconds -= duration.durationInSeconds;
}

(未经测试,但你应该明白)

请注意,joda-time 有一个 Duration 类可以满足您的需求。

于 2013-05-27T07:18:49.410 回答