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

VB.NET计时器小时数在30分钟进位而非整点,每小时均异常

问题分析与解决方案

问题根源

计时器小时数在30分钟时提前进位的核心原因是**CInt(elapsed1.TotalHours)的四舍五入行为**:

  • TotalHours返回包含小数的总小时数(例如30分钟时为0.5)
  • VB的CInt函数会将0.5这类数值向上舍入为整数1,而非截断小数部分,导致小时数未到整点就提前进位。

修复代码

修改TimerCarPit1_Tick方法中的字符串格式化逻辑,用Math.Floor取总小时数的整数部分,替代直接使用CInt:

Private Sub TimerCarPit1_Tick(sender As Object, e As EventArgs) Handles TimerCarPit1.Tick
    If running1 = True Then
        elapsed1 = DateTime.Now - startTime1
    End If

    Car1TimeLabel2.Text = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                                     CInt(Math.Floor(elapsed1.TotalHours)), ' 关键修改点
                                     elapsed1.Minutes,
                                     elapsed1.Seconds,
                                     elapsed1.Milliseconds \ 10)
End Sub

额外优化建议

可以直接利用TimeSpan的内置格式化能力简化代码,避免手动拆分时间组件,同时保证格式准确性:

' 适用于24小时内的计时,自动处理时分秒和毫秒
Car1TimeLabel2.Text = elapsed1.ToString("hh\:mm\:ss\.ff")

' 若需支持超过24小时的累计计时,使用以下格式
Car1TimeLabel2.Text = $"{CInt(Math.Floor(elapsed1.TotalHours)):00}:{elapsed1:mm\:ss\.ff}"

补充说明

  • Math.Floor会向下取整,确保只有当总时长达到完整小时(如1.0小时)时,小时数才会进位
  • 若需要统计超过24小时的累计时间,必须使用TotalHours结合取整,不能直接用elapsed1.Hours(后者会在24小时后重置为0)

内容的提问来源于stack exchange,提问作者Dazza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:47:06