1

いくつかの一般的なコードを除外するための一般的なパターンを探しています。異なる算術演算で異なるプロパティを持つクラス間で代数の加算と減算を実装する必要があります。古典的なケースの 1 つは、秒、時間、分で表現できる間隔であり、3 つの int プロパティを持つクラスで実装しました。

たとえば、0 秒 0 分 1 時間の期間から 0 秒 30 分 0 時間の期間を減算したい場合、0 秒 30 分 1 の期間を取得したくありません。時間。

2 つの時間間隔の間で加算と減算をコーディングする必要がありますが、この代数をコーディングする一般的なパターンはありますか? 別の表現を探すべきですか?

アップデート

私のユースケースは通常、年、月、日、およびそれらの組み合わせで表される期間に適用されるため、質問を単純化しすぎました。問題は、ユーザーが日、月、年の観点から考え、正確な変換ができないことです (1 か月は何日ですか? まあ、それはさまざまです)。

したがって、ユーザーは 6M 3 日で何かを計算したいことを知っており、計算が行われると、その間隔を基準日に適用し、正しい結果を取得します。6M 3D を合計日数で変換する方法はありません。これは、選択した基準日によって異なり、時間の経過とともに変化するためです。

4

2 に答える 2

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 に答える