How can a Timespan-Day last only for 8 Hours?

前端 未结 3 1540
我在风中等你
我在风中等你 2021-01-03 08:07

I have saved a duration in minutes and want to have an output \"1 day 5 hours 30 minutes\". Currently i add the minutes to a Timespan and do something like this:

<         


        
相关标签:
3条回答
  • 2021-01-03 08:52

    Can you simply use:

    (int)(ts.TotalHours / 8)
    

    instead of ts.Days? Then use

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

    instead of ts.Hours.

    0 讨论(0)
  • 2021-01-03 08:55

    You need to implement something like this:

    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());
    

    Will write something like

    "3 workday(s) and 3:32"
    
    0 讨论(0)
  • 2021-01-03 09:09

    Here is my code for those who need it.

    DynamicTimeSpan-Class:

    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;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题