我正在寻找一个通用的模式来分解一些常见的代码:我需要在具有不同算法的不同属性的类之间实现代数加法和减法。一个经典案例是一个间隔,可以用秒,小时和分钟表示,我用一个具有三个int属性的类实现。
例如,如果我要减去0秒,0分钟和1小时0秒,30分钟,0小时的时间段,我不想获得0秒的时间段,-30分钟,1小时。
我需要在两个时间间隔之间编码加减法,是否有任何常用模式来编码这个代数?我应该寻找不同的代表吗?
更新
我过分简化了这个问题,因为我的用例通常适用于以年,月,日及其组合表示的时间段。困难在于用户根据天,月,年来进行思考,并且没有可能的确切转换(一个月有多少天?嗯......有所不同)
因此,用户知道他将要在6M 3天内计算某些东西,并且当计算发生时,我会将该间隔应用于参考日期,从而获得正确的结果。我无法在总天数内转换6M 3D,因为这取决于您选择的参考日期,这将随着时间的推移而变化。
答案 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类。