【问题标题】:Time elapsed between two dates两个日期之间经过的时间
【发布时间】:2014-07-02 16:33:04
【问题描述】:

我想找到两个日期之间经过的确切时间,条件是如果任何值为“0”,则其测量单位应该消失。例如,如果小时和分钟比过去的时间长,则应该像 1 天 40 秒而不是 1 天 0 小时 0 分钟 40 秒。

TimeSpan elapsed = completdDate.Subtract(insertdDate);

int daysEl= elapsed.Days;
int hrsEl= elapsed.Hours;
int minsEl = elapsed.Minutes;
int secEl = elapsed.Seconds;

string totalTime = string.Empty;
string days = string.Empty;
string hours = string.Empty;
string mins = string.Empty;
string secs = string.Empty;

if (daysEl == 0 )
    days = days.Replace(daysEl.ToString() , "");
else
  days = daysEl.ToString();

if (hrsEl==0)
    hours = hours.Replace(hrsEl.ToString() , "");
else 
    hours = hrsEl.ToString();

if (minsEl == 0)
    mins = mins.Replace(minsEl.ToString(), "");
else
    mins = minsEl.ToString();

if (secEl == 0)
    secs = secs.Replace(secEl.ToString(), "");
else 
    secs = secEl.ToString();

totalTime = days  + "days" 
          + hours + "hours" 
          + mins  + "minutes" 
          + secs  + "seconds";

********************************输出************** ***************

【问题讨论】:

  • 使用 StringBuilder 并且只添加你需要的位。
  • 今后请多努力格式化您的代码。
  • 如果你把它复制回你的代码库,一定要赞美我;)

标签: c# c#-4.0 datetime if-statement time


【解决方案1】:

你可以去掉中间字符串和 if 语句:

totalTime = 
    (daysEl  == 0 ? "" : (daysEl  + " days "))
  + (hoursEl == 0 ? "" : (hoursEl + " hours "))
  + (minsEl  == 0 ? "" : (minsEl  + " minutes "))
  + (secsEl  == 0 ? "" : (secsEl  + " seconds "));

【讨论】:

    【解决方案2】:

    如果您想省略零值,您更有可能查看格式问题,而不是计算问题,并且使用StringBuilder 可能更容易。

    var sb = new StringBuilder();
    
    if (elapsed.Days != 0)
        sb.AppendFormat("{0} days ", elapsed.Days);
    if (elapsed.Hours != 0)
        sb.AppendFormat("{0} hours ", elapsed.Hours);
    if (elapsed.Minutes != 0)
        sb.AppendFormat("{0} minutes ", elapsed.Minutes);
    if (elapsed.Seconds != 0)
        sb.AppendFormat("{0} seconds ", elapsed.Seconds);
    
    if (sb.Length == 0)
        return "instant!";
    
    // get rid of the last space in there!
    return sb.ToString().Substring(0,sb.Length-1); 
    

    通过使用格式,您可以更简洁地将值与单位(即“14 秒”)绑定,从而将整个部分放入 if 语句中,如果该部分为零,则完全绕过该部分。

    【讨论】:

      【解决方案3】:
      void Main()
      {
          TimeSpan elapsed = DateTime.Now - DateTime.Now.AddDays(-1);
      
          int daysEl= elapsed.Days;
          int hrsEl= elapsed.Hours;
          int minsEl = elapsed.Minutes;
          int secEl = elapsed.Seconds;
      
          var sb = new StringBuilder();
      
          if (daysEl != 0 )
              sb.Append(daysEl + " days ");
          if (hrsEl != 0)
              sb.Append(hrsEl + " hours ");
          if (minsEl != 0)
              sb.Append(minsEl + " mins ");   
          if (secEl != 0)
              sb.Append(secEl + " secs ");
      
          string totalTime = sb.ToString();
      
          Console.WriteLine (totalTime);
      }
      

      【讨论】:

      • 如果我没看错,您将获得 1 天(如果您的系统好的话 ;))...当然这与 Aravol 的回答相同
      • 错了吗?有些人可能会说我的答案更接近于 OP 的代码,这将使他/她的水平更容易理解......
      • 这没有错 - 但通常你不希望这里有 n 倍相同的基本答案 - 没有冒犯的人
      猜你喜欢
      • 2013-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 2011-06-08
      相关资源
      最近更新 更多