如何移除数字中60的指定倍数?及修复Stopwatch计时格式化问题?
问题一:如何从数字中移除60的指定倍数?
嘿,这个问题其实用基础的取模运算就能轻松解决!取模运算(用%符号表示)的作用就是返回两个数相除后的余数,而这个余数正好是原数减去最大的不超过它的60的倍数后剩下的部分。
举几个直观的例子:
- 如果你的数字是125,
125 % 60会返回5,也就是去掉了2个60的倍数(120); - 如果数字是60,
60 % 60返回0,刚好移除一个60的倍数; - 如果数字是75,
75 % 60返回15,移除1个60的倍数。
要是你遇到负数的情况(不过看你后续的秒表场景,应该用不上),可以稍作调整保证结果非负,但针对你的需求,直接用数字 % 60就完全够用啦!
问题二:修复Stopwatch的时分秒格式化异常
我一眼就揪出问题所在了——你直接用了TotalHours、TotalMinutes、TotalSeconds的整数值,这些属性返回的是从计时开始累计的总时长,而不是当前小时内的分钟数、当前分钟内的秒数,所以自然不会自动重置为0。
修正方案
我们只需要对分钟和秒做取模运算,或者直接利用Elapsed对象自带的Minutes和Seconds属性(它们本身就是当前小时/分钟内的数值,会自动归零)。同时保留TotalHours来累计总小时数,符合你判断24小时超时的逻辑。
修改后的代码片段如下:
updater.Tick += (sender, e) => { hours = (int)stopwatch.Elapsed.TotalHours; // 用总分钟数取模60,得到当前小时内的分钟数 minutes = (int)stopwatch.Elapsed.TotalMinutes % 60; // 用总秒数取模60,得到当前分钟内的秒数 seconds = (int)stopwatch.Elapsed.TotalSeconds % 60; if (hours > 24) { MessageBox.Show("Time limit exceeded. Please reset Stopwatch to continue.", "Time Limit Exceeded", MessageBoxButtons.OK, MessageBoxIcon.Error); } lblHours.Text = string.Format("{0:D2}", hours); lblMinutes.Text = string.Format("{0:D2}", minutes); lblSeconds.Text = string.Format("{0:D2}", seconds); Application.DoEvents(); };
为什么这样改?
TotalMinutes % 60:总分钟数除以60的余数,就是当前小时还没满1小时的分钟数,比如总分钟数是65,65%60=5,刚好是第1小时的第5分钟;TotalSeconds % 60:同理,总秒数除以60的余数就是当前分钟内的秒数,到60秒自动归0;- 嫌取模麻烦的话,也可以直接用
stopwatch.Elapsed.Minutes和stopwatch.Elapsed.Seconds,效果和上面完全一样,因为Elapsed的这两个属性本身就代表当前时段内的数值。
这样修改后,你的秒表就会按照常规计时逻辑显示,整分钟时秒数归0,整小时时分钟数归0啦!
内容的提问来源于stack exchange,提问作者sh4d0w4RCH3R415
相关产品推荐
相关产品推荐

