2010-08-16 50 views
3

我已经在几分钟内保存了一段时间,并希望输出“1天5小时30分钟”。目前我添加分钟到Timespan并做类似这样的事情:Timespan日只能持续8小时?

TimeSpan ts = new TimeSpan(0,0,1800, 0); 
Response.Write(ts.Days + "day(s) " + ts.Hours + " hour(s)" + ts.Minutes + " minutes"); 

但是现在我只关心一天的工作时间。所以当TimeSpan的持续时间是27小时时,它不应该创建输出“1天3小时”。我想要“3天3小时”。

是否有一种简单的方法可以用Timespan对象来做到这一点?是否可以更改TimeSpan的默认行为?还是我必须编写我自己的定制Timespan-Class?

THX cpt.oneeye

+0

这里是一个暗示:'div'和'mod'。 – leppie 2010-08-16 12:13:59

+0

@theburningmonk:是的... 12小时会更现实一些,因为我们正在使用它来跟踪我们自己的工作时间:) – 2010-08-16 14:34:27

回答

9

,你可以简单地使用:

(int)(ts.TotalHours/8) 

,而不是ts.Days?然后使用

(((int)ts.TotalHours) % 8) 

而不是ts.Hours

5

你需要实现这样的事情:

TimeSpan workday = new TimeSpan(8, 0, 0); 
int workdays = ts.Ticks/workday.Ticks 
TimeSpan rest = new TimeSpan(ts.Ticks % workday.Ticks) 
Response.Write(workdays + "workday(s) and" + rest.ToString()); 

会写类似

"3 workday(s) and 3:32" 
2

这里是我的代码为那些谁需要它。

DynamicTimeSpan级:

using System; 
using System.Text; 

namespace fooLib 
{ 
    /// <summary> 
    /// Timespan where you can define the number of hours a day can last (+ days of week). 
    /// Optimal for calculating bussinesshours. 
    /// </summary> 
    public class DynamicTimeSpan 
    { 
     private int _hoursPerDay = 8; 
     private int _daysPerWeek = 5; 
     private int _totalMinutes = 0; 

     public int HoursPerDay 
     { 
      get { return _hoursPerDay; } 
      set { _hoursPerDay = value; } 
     } 

     public int DaysPerWeek 
     { 
      get { return _daysPerWeek; } 
      set { _daysPerWeek = value; } 
     } 

     public int Weeks 
     { 
      get 
      { 
       return (int)(((_totalMinutes/60)/this.HoursPerDay)/this.DaysPerWeek); 
      } 
     } 

     public int Days 
     { 
      get 
      { 
       return (int)((decimal)TotalDays - (decimal)(Weeks * this.DaysPerWeek)); 
      } 
     } 

     public int Hours 
     { 
      get 
      { 
       return (int)((decimal)TotalHours - (decimal)(Weeks * this.DaysPerWeek * this.HoursPerDay) - (decimal)(Days * this.HoursPerDay)); 
      } 
     } 

     public int Minutes 
     { 
      get 
      { 
       return _totalMinutes - (Weeks * this.DaysPerWeek * this.HoursPerDay * 60) - (Days * this.HoursPerDay * 60) - (Hours * 60); 
      } 
     } 

     public decimal TotalDays 
     { 
      get { return (decimal)_totalMinutes/(decimal)60/(decimal)this.HoursPerDay; } 
     } 

     public decimal TotalHours 
     { 
      get { return (decimal)_totalMinutes/(decimal)60; } 
     } 

     public int TotalMinutes 
     { 
      get { return _totalMinutes; } 
     } 

     public static DynamicTimeSpan operator +(DynamicTimeSpan ts1, DynamicTimeSpan ts2) 
     { 
      return new DynamicTimeSpan(ts1._totalMinutes + ts2._totalMinutes); 
     } 

     public static DynamicTimeSpan operator -(DynamicTimeSpan ts1, DynamicTimeSpan ts2) 
     { 
      return new DynamicTimeSpan(ts1._totalMinutes - ts2._totalMinutes); 
     } 

     public DynamicTimeSpan() 
     { 

     } 

     public DynamicTimeSpan(int totalMinutes) 
     { 
      _totalMinutes = totalMinutes; 
     } 

     public DynamicTimeSpan(int weeks, int days, int hours, int minutes) 
     { 
      _totalMinutes = (weeks * this.DaysPerWeek * this.HoursPerDay * 60) + (days * this.HoursPerDay * 60) + (hours * 60) + minutes; 
     } 

     /// <summary> 
     /// "1 week 2 days 4 hours 30 minutes" 
     /// </summary> 
     /// <returns></returns> 
     public override string ToString() 
     { 
      string str = ""; 

      if (this.Weeks == 1) 
      { 
       str += this.Weeks + " week "; 
      } 
      else if (this.Weeks > 1) 
      { 
       str += this.Weeks + " weeks "; 
      } 

      if (this.Days == 1) 
      { 
       str += this.Days + " day "; 
      } 
      else if (this.Days > 1) 
      { 
       str += this.Days + " days "; 
      } 

      if (this.Hours == 1) 
      { 
       str += this.Hours + " hour "; 
      } 
      else if (this.Hours > 1) 
      { 
       str += this.Hours + " hours "; 
      } 

      // only write minutes when the duration is lower than one day 
      if (this.Weeks == 0 && this.Days == 0 && this.Minutes > 0) 
      { 
       str += this.Minutes + " minutes"; 
      } 

      return str; 
     } 
    } 
}