You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除数字中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:37:52