Intereting Posts
C # SQLite, firebase database остается заблокированной после чтения Являются ли streamи C # структур безопасными? OutOfMemoryException – из идей Почему предупреждение CS1607 «Версия, указанная для« версии продукта », не находится в нормальном формате« major.minor.build.revision », сгенерированном? Формат строки соединения Odbc, а не поиск файлов Доступ к пути к папке данных приложений для всех пользователей Windows Собственный хост C # с поддержкой Chrome Native Messaging Создание streamов данных в C # Динамический Linq Groupby SELECT Key, List Назначает ли null исключение всех обработчиков событий из объекта? Случайная итерация в цикле Как протестировать COM-зависимый объект в C # Получить локализованные дружественные имена для всех приложений winrt / metro, установленных из приложения WPF Как захватить дамп памяти процесса в .NET-процессе, когда .NET не находится в середине сборки мусора (GC) kinect c # рисовать и перемещать скелет из сохраненных данных

Как может Timespan-Day длиться всего 8 часов?

Я сохранил продолжительность в минутах и ​​хочу иметь выход «1 день 5 часов 30 минут». В настоящее время я добавляю минутку к Timespan и делаю что-то вроде этого:

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

Можете ли вы просто использовать:

 (int)(ts.TotalHours / 8) 

вместо ts.Days ? Затем используйте

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

вместо ts.Hours .

Вам нужно реализовать что-то вроде этого:

 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" 

Вот мой код для тех, кто в нем нуждается.

DynamicTimeSpan-class:

 using System; using System.Text; namespace fooLib { ///  /// Timespan where you can define the number of hours a day can last (+ days of week). /// Optimal for calculating bussinesshours. ///  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; } ///  /// "1 week 2 days 4 hours 30 minutes" ///  ///  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; } } }