【问题标题】:Calculating an elapsed Time计算经过的时间
【发布时间】:2021-07-12 13:24:38
【问题描述】:

我想根据带有HH:mm:ss:ff 格式的时间戳的 2 个字符串来计算进程需要执行的经过时间。因此,我将这些字符串拆分,将它们转换为整数并减去它们。

我尝试的是从第一个时间戳中减去最后一个时间戳。它有时也有效。但我也从中得到了很多奇怪的反馈——例如:0:0:-3:-18 我认为这是因为如果一个值高于另一个值并且它们被分割,则不处理该案例的结果。

这是我用来减去字符串的函数:

        static string calculateElapsedTime(string startTime, string endTime)
    {
        try
        {
            string[] startTimeSplit = startZeit.Split(new char[] { ':', '.' });
            string[] endTimeSplit = endZeit.Split(new char[] { ':', '.' });
            int[] elapsedTime = new int[4];

            endTimeSplit[0] = Convert.ToInt32(endTimeSplit[0]) - Convert.ToInt32(startTimeSplit[0]);
            endTimeSplit[1] = Convert.ToInt32(endTimeSplit[1]) - Convert.ToInt32(startTimeSplit[1]);
            endTimeSplit[2] = Convert.ToInt32(endTimeSplit[2]) - Convert.ToInt32(startTimeSplit[2]);
            endTimeSplit[3] = Convert.ToInt32(endTimeSplit[3]) - Convert.ToInt32(startTimeSplit[3]);

            string elapsedTimeString = string.Format("{0}:{1}:{2}:{3}", endTimeSplit[0], endTimeSplit[1], endTimeSplit[2], endTimeSplit[3]);

            return elapsedTimeString;
        }
        catch( Exception ex )
        {
            Console.WriteLine(ex.Message);
            return "null";
        }
    }

我通过简单地获取时间来获得参数的值:

DateTime.Now.ToString("HH:mm:ss:ff", System.Globalization.DateTimeFormatInfo.InvariantInfo);

解决方案:

在命名空间 System.Diagnostics 中有一个名为 Stopwatch 的函数。

你可以如下使用它:

Stopwatch watch = new Stopwatch();
watch.Start();
//Prozess
watch.Stop();
Console.WriteLine(watch.Elapsed);

【问题讨论】:

  • 很高兴知道。好吧,我现在第一次用 C# 处理时间,我认为没关系;)
  • 你说的是除法,但也许你的意思是减法?

标签: c# time


【解决方案1】:

您可以使用正确的format 转换为TimeSpan 并减去它们,例如:

string format = "HH:mm:ss:ffff";
TimeSpan startTimeSpan = TimeSpan.ParseExact(startTime, format, null);
TimeSpan endTimeSpan = TimeSpan.ParseExact(endTime, format, null);

TimeSpan result = startTimeSpan - endTimeSpan;

string elapsedTimeString = string.Format("{0}:{1}:{2}:{3}", 
                                          result.Hours.ToString("00"), 
                                          result.Minutes.ToString("00"),
                                          result.Seconds.ToString("00"),
                                          result.Milliseconds.ToString("00"));

return elapsedTimeString;

查看 MSDN 文档中的 TimeSpan Formats

【讨论】:

  • TotalHours、TotalMinutes 等返回以相关单位表示的总 TimeSpan 值。您可能打算改为获取单个组件: string elapsedTimeString = string.Format("{0}:{1}:{2}:{3}", result.Hours, result.Minutes, result.Seconds, result.Milliseconds );
  • 是的,我已经更正了我的答案。谢谢@RossMcNab :)
  • 这似乎还有另一个问题。它说:“给定的字符串格式错误”我正在调试这个,如果我有错误,我会告诉你更多。
  • 我认为毫秒的格式是ffff。看看我的编辑,我在其中添加了 MSDN 文档的链接。
  • 试过了,不是解决办法。
【解决方案2】:

我遇到了这个,这就是我创造的。如果您愿意,可以添加月份的计算。您也可以使用total<days, hours...>,但它会破坏代码。生成转换器以转换为DateTime。很有帮助。

public static string TimeElapsed(DateTime start_Time, DateTime end_time)
{
  string result = "";
  var subtractedDate = end_time.Subtract(start_Time);
  if (subtractedDate.Days >= 7)
  {
    var weeks = (int)(subtractedDate.Days / 7);
    if (weeks >= 52)
    {
      var years = (int)(weeks / 52);
      result = $"{years} years ago";
    }
    else
    {
      result = $"{weeks} weeks ago";
    }
   
  }
  else if (subtractedDate.Days > 0 && subtractedDate.Days < 7)
  {
    result = $"{subtractedDate.Days} days ago";
  }
  else
  {
    if (subtractedDate.Hours> 0)
    {
      result = $"{subtractedDate.Hours} hours ago";
    }
    else
    {
      if (subtractedDate.Minutes > 0)
      {
        result = $"{subtractedDate.Minutes} mins ago";
      }
      else
      {
        result = "< 1 min ago";

      }
    }
  }

  return result;
}

【讨论】:

    猜你喜欢
    • 2016-04-25
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多