详细解析如何用 C# 计算基于 CurrentOverTime(当前已执行的毫秒数)和 TestTime(测试时长,单位为小时)来计算结束时的日期和时间,格式为 yyyyMMdd HH:mm:ss

问题分析

  • 输入
    • CurrentOverTime:当前已执行的毫秒数(类型通常为 longdouble)。
    • TestTime:测试总时长,单位为小时(类型通常为 doublefloat)。
  • 目标
    • 计算测试结束时的日期和时间。
    • 输出格式为 yyyyMMdd HH:mm:ss(例如:20250828 16:23:00)。
  • 假设
    • 题目未明确指定起始时间,因此假设从当前时间(即调用代码时的系统时间)开始计算。
    • CurrentOverTime 表示已经过去的毫秒数,TestTime 是总测试时长,剩余时间需要计算。
  • 逻辑
    1. 获取当前时间作为起点。
    2. CurrentOverTime(毫秒)转换为时间间隔,计算已经过去的时间。
    3. TestTime(小时)转换为毫秒,计算总测试时间。
    4. 计算剩余时间 = 总测试时间 - 已过去时间。
    5. 当前时间 + 剩余时间 = 结束时间。
    6. 将结束时间格式化为 yyyyMMdd HH:mm:ss

C# 代码实现

以下是详细的 C# 代码实现,包含注释说明每一步:

using System;

public class Program
{
    public static string CalculateEndTime(long CurrentOverTime, double TestTime)
    {
        // 1. 获取当前时间作为起点
        DateTime startTime = DateTime.Now;

        // 2. 将 CurrentOverTime(毫秒)转换为时间间隔
        TimeSpan elapsedTime = TimeSpan.FromMilliseconds(CurrentOverTime);

        // 3. 将 TestTime(小时)转换为毫秒
        double totalTestTimeMs = TestTime * 60 * 60 * 1000; // 小时 -> 毫秒
        TimeSpan totalTestTime = TimeSpan.FromMilliseconds(totalTestTimeMs);

        // 4. 计算剩余时间
        TimeSpan remainingTime = totalTestTime - elapsedTime;

        // 5. 计算结束时间 = 当前时间 + 剩余时间
        DateTime endTime = startTime + remainingTime;

        // 6. 格式化为 yyyyMMdd HH:mm:ss
        string formattedEndTime = endTime.ToString("yyyyMMdd HH:mm:ss");

        return formattedEndTime;
    }

    public static void Main()
    {
        // 示例:已执行 5000 毫秒(5秒),测试总时长 2 小时
        long CurrentOverTime = 5000;
        double TestTime = 2.0;

        string endTime = CalculateEndTime(CurrentOverTime, TestTime);
        Console.WriteLine($"测试结束时间: {endTime}");
    }
}

代码详解

  1. 获取当前时间

    • 使用 DateTime.Now 获取当前系统时间,作为计算的起点。
    • 示例中假设当前时间为 2025-08-28 16:23:00
  2. 转换 CurrentOverTime

    • CurrentOverTime 是毫秒数,使用 TimeSpan.FromMilliseconds 转换为 TimeSpan 对象,表示已过去的时间。
    • 例如,5000 毫秒 = 5 秒。
  3. 转换 TestTime

    • TestTime 是小时数,需转换为毫秒:
      • 1 小时 = 60 分钟 × 60 秒 × 1000 毫秒 = 3,600,000 毫秒。
      • 例如,TestTime = 2 小时 = 2 × 3,600,000 = 7,200,000 毫秒。
    • 使用 TimeSpan.FromMilliseconds 转换为 TimeSpan
  4. 计算剩余时间

    • 剩余时间 = 总测试时间 - 已过去时间。
    • 例如:总时间 7,200,000 毫秒 - 已过去 5,000 毫秒 = 7,195,000 毫秒。
  5. 计算结束时间

    • 使用 DateTime 的加法运算:startTime + remainingTime
    • 例如:2025-08-28 16:23:00 + 7,195,000 毫秒(约 2 小时 - 5 秒)
  6. 格式化输出

    • 使用 ToString("yyyyMMdd HH:mm:ss") 将结束时间格式化为 yyyyMMdd HH:mm:ss
    • 例如:20250828 18:22:55

示例运行

假设:

  • 当前时间:2025-08-28 16:23:00
  • CurrentOverTime = 5000(5秒)
  • TestTime = 2(2小时)

运行结果:

测试结束时间: 20250828 18:22:55

解释:

  • 总测试时间 = 2 小时 = 7200 秒。
  • 已过去时间 = 5 秒。
  • 剩余时间 = 7200 - 5 = 7195 秒(约 1 小时 59 分 55 秒)。
  • 结束时间 = 16:23:00 + 1:59:55 = 18:22:55。

边界情况处理

  1. 负值处理

    • 如果 CurrentOverTime 超过 TestTime,剩余时间可能为负,导致结束时间早于当前时间。
    • 可添加检查:
      if (remainingTime.TotalMilliseconds < 0)
      {
          throw new ArgumentException("CurrentOverTime 超过 TestTime,测试已结束!");
      }
      
  2. 精度问题

    • TestTimedouble,可能包含小数(例如 2.5 小时)。
    • C# 的 TimeSpanDateTime 计算能精确处理小数。
  3. 时间格式

    • 确保使用 HH(24小时制)而非 hh(12小时制),以符合题目要求。

扩展:自定义起始时间

如果题目要求从特定时间开始(而非 DateTime.Now),可以修改代码,添加参数:

public static string CalculateEndTime(long CurrentOverTime, double TestTime, DateTime startTime)
{
    TimeSpan elapsedTime = TimeSpan.FromMilliseconds(CurrentOverTime);
    double totalTestTimeMs = TestTime * 60 * 60 * 1000;
    TimeSpan totalTestTime = TimeSpan.FromMilliseconds(totalTestTimeMs);
    TimeSpan remainingTime = totalTestTime - elapsedTime;
    DateTime endTime = startTime + remainingTime;
    return endTime.ToString("yyyyMMdd HH:mm:ss");
}

调用示例:

DateTime customStart = new DateTime(2025, 8, 28, 10, 0, 0);
string endTime = CalculateEndTime(5000, 2.0, customStart);
Console.WriteLine($"测试结束时间: {endTime}"); // 输出: 20250828 11:59:55

总结

  • 核心逻辑:将时间单位转换为 TimeSpan,计算剩余时间后加到起始时间,格式化输出。
  • 关键点:注意单位转换(小时到毫秒)、时间格式(yyyyMMdd HH:mm:ss)、边界情况。
  • C# 特性:使用 DateTimeTimeSpan 进行精确时间计算,ToString 格式化输出。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐