2016-09-25 5 views
4

コンストラクタを数秒で作成してHH:MM:SSに変換するコンストラクタを作成したいとします。私は正の秒でかなり簡単にこれを行うことができますが、私は負の秒でいくつかの難しさに走っています。ここで負の秒から時を分:秒に変換します。

は、私がこれまで持っているものです。

private final int HOUR, MINUTE, SECOND, TOTAL_TIME_IN_SECONDS; 

public MyTime(int timeInSeconds) { 
    if (timeInSeconds < 0) { 
     //Convert negative seconds to HH:MM:SS 
    } else { 
     this.HOUR = (timeInSeconds/3600) % 24; 
     this.MINUTE = (timeInSeconds % 3600)/60; 
     this.SECOND = timeInSeconds % 60; 
     this.TOTAL_TIME_IN_SECONDS 
       = (this.HOUR * 3600) 
       + (this.MINUTE * 60) 
       + (this.SECOND); 
    } 
} 

TimeInSecondsをがある場合は-1、私は時間が23時59分59秒を返すようにしたい、など

ありがとう!

答えて

1

どの程度

if (timeInSeconds < 0) { 
    return MyTime(24 * 60 * 60 + timeInSeconds); 
} 

したがってそれはループだろう、とあなたがあなたの既存のロジックを利用することになります。

あなたは、コンストラクタの先頭にそれを追加

+0

Sergio answer - whileは非常に効率的ではありません。モジュロ(%)ははるかに優れています –

2
if (time < 0) 
    time += 24 * 60 * 60; 

再帰を避けるためにwhileループでifを置き換えることができます。 大きな負の数が予想される場合は、IFを実行します。

+0

"while"はあまり効率的ではありません。モジュロははるかに良い:-1%86400 = 86399 –

+0

ちょうどそれを試みた...動作しません。それが負であることを知っているなら、これをしなければなりません:86400 + num%86400; -1から86399を得る。 –

+0

あなたは正しいです - ごめんなさい。私は%がPythonでどのように動作するのかと混乱しました(これはPythonで86399を返します)。しかし、一般的なアイデアは正しかった - それは%よりも効率的です。 –

2
class MyTime { 
    private final int HOUR, MINUTE, SECOND, TOTAL_TIME_IN_SECONDS; 
    private static final int SECONDS_IN_A_DAY = 86400; 

    public MyTime(int timeInSeconds) { 
    prepare(normalizeSeconds(timeInSeconds)); 
    } 

    private int normalizeSeconds(int timeInSeconds) { 
     //add timeInSeconds % SECONDS_IN_A_DAY modulo operation if you expect values exceeding SECONDS_IN_A_DAY: 
     //or throw an IllegalArgumentException 
     if (timeInSeconds < 0) { 
     return SECONDS_IN_A_DAY + timeInSeconds; 
    } else { 
     return timeInSeconds; 
    } 
    } 

    private prepare(int timeInSeconds) { 
     this.HOUR = (timeInSeconds/3600) % 24; 
     this.MINUTE = (timeInSeconds % 3600)/60; 
     this.SECOND = timeInSeconds % 60; 
     this.TOTAL_TIME_IN_SECONDS 
       = (this.HOUR * 3600) 
       + (this.MINUTE * 60) 
       + (this.SECOND); 
    } 

} 
関連する問題