在Java中使用modulo X实现算术

时间:2013-05-27 07:07:45

标签: java scala math

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

例如,如果我要减去0秒,0分钟和1小时0秒,30分钟,0小时的时间段,我不想获得0秒的时间段,-30分钟,1小时。

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

更新

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

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

2 个答案:

答案 0 :(得分:2)

对于此特定用例,您可能需要查看scala-time

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

(2.hours + 45.minutes + 10.seconds).millis
returns Long = 9910000

答案 1 :(得分: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类。