у меня есть этот код, чтобы занять время в прошлом и генерировать читаемую строку для представления, когда это было.
Я думал бы Промежуток. Часы дали бы Вам часы, даже если его несколько daye в прошлом, но оно похоже на него, разламывают его на его отдельные компоненты (дни, месяцы, и т.д.). Как я добрался бы несколько общих часы назад (даже если его больше чем 1 день?
Есть ли любой более чистый способ записать этот тип кода ниже, поскольку это кажется симпатичным spagetti-выходом.
Вот код
DateTime when = GetDateTimeinPast();
TimeSpan ts = DateTime.Now.Subtract(when);
switch (ts.Days)
{
case 0:
if (ts.Hours < 1)
b.Append( ts.Minutes + " minutes ago");
else
b.Append( ts.Hours + " hours ago");
break;
case 1:
b.Append( " yesterday");
break;
case 2:
case 3:
case 4:
b.Append( "on " + when.DayOfWeek.ToString());
break;
default:
b.Append(ts.Days + " days ago");
break;
}
Используйте свойство TotalHours
или другие свойства Total [TimeUnit]
в объекте промежутка времени.
Для промежутка времени 1:10 (чч: мм) это равняется 1 часам
и 10 минутам
или 1,167 общему количеству часов
и 70 TotalMinutes
.
Что касается очистки, используйте ветки if / else, как и раньше. switch / case не поможет вам в этих условиях, только для определенных значений. Примерно так:
DateTime when = GetDateTimeinPast();
TimeSpan ts = DateTime.Now.Subtract(when);
if (ts.TotalHours < 1)
b.AppendFormat("{0} minutes ago", (int)ts.TotalMinutes);
else if (ts.TotalDays < 1)
b.AppendFormat("{0} hours ago", (int)ts.TotalHours);
//etc...
В качестве альтернативы у меня есть решение, которое делает это не только днями, но и неделями, месяцами и годами. Подход немного другой. Он продвигается от прошлого к будущему, сначала пробуя большие шаги, а если он перескакивает, переключаясь на следующий, меньший.