手作業で24時間制のロールオーバーをエミュレートしようとしています(数学とタイムスパンクラスの使用)。インクリメント部分は、23:00から0:00まで、およびそれからロールオーバーする方法を理解するのは簡単でしたが、逆に進めると、非常に混乱することがわかりました。これが私がこれまでに持っているものです:
static void IncrementMinute(int min, int incr)
{
int newMin = min + incr,
hourIncrement = newMin / 60;
//increment or decrement the hour
if((double)newMin % 60 < 0 && (double)newMin % 60 > -1)
hourIncrement = -1;
Console.WriteLine("Hour increment is {0}: ", hourIncrement);
}
私が見つけた問題は、逆方向に進むときに、のモジュラスが数値の間にある場合、正しくデクリメントされないことです。例:12:00で、61分を引くと、12:00から11:59に移動する場合は1時間ロールバックし、11:00から移動する場合は1時間ロールバックするため、時刻は10:59になることがわかります。 10:59まで。残念ながら、計算方法:この場合のnewMin%60は、最初の1時間のロールバックのみを取得しますが、2番目のロールバックは技術的には余りとして-1.0166であり、modは整数のみを返すため、四捨五入されます。ここでいくつかの基本的な数学が欠けていると確信していますが、誰かが私を助けてくれますか?
編集:私はこれを長短にいくつかの方法で書いてきました。いくつかは他のものよりも近いですが、私はこれが見た目よりも単純であることを知っています。これはちょっと「wtfは彼がやっていた」ように見えることは知っていますが、基本的にはImが何をしようとしているのかを見ることができるはずです。時計をインクリメントして23:59から0:00にロールオーバーするのは簡単です。後戻りするのはそれほど簡単ではないことが証明されています。
OK、これがロールオーバーのincrementMinuteです。単純。しかし、逆行してみてください。動作しません。
static void IncrementMinute(int min, int incr)
{
int newMin = min + incr,
hourIncrement = newMin / 60;
min = newMin % 60;
Console.WriteLine("The new minute is {0} and the hour has incremented by {1}", min, hourIncrement);
}