Как мне умножить объект TimeSpan в C #? Предполагая, что переменная duration
- это TimeSpan , я бы хотел, например,
duration*5
Но это дает мне ошибку «оператор * не может применяться к типам TimeSpan и int». Вот мой текущий обходной путь
duration+duration+duration+duration+duration
Но это не распространяется на нецелые числа, например. duration * 3.5
Ответы:
Из этой статьи
TimeSpan duration = TimeSpan.FromMinutes(1); duration = TimeSpan.FromTicks(duration.Ticks * 12); Console.WriteLine(duration);
источник
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Для желающих скопировать и вставить:
namespace Utility { public static class TimeSpanExtension { /// <summary> /// Multiplies a timespan by an integer value /// </summary> public static TimeSpan Multiply(this TimeSpan multiplicand, int multiplier) { return TimeSpan.FromTicks(multiplicand.Ticks * multiplier); } /// <summary> /// Multiplies a timespan by a double value /// </summary> public static TimeSpan Multiply(this TimeSpan multiplicand, double multiplier) { return TimeSpan.FromTicks((long)(multiplicand.Ticks * multiplier)); } } }
Пример использования:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
будет 150 секунд.источник
TimeSpan
Структура не обеспечивает перегрузку для*
оператора, так что вы должны сделать это самостоятельно:var result = TimeSpan.FromTicks(duration.Ticks * 5);
источник
TimeSpan.Multiply
прибыл в .NET Core и, похоже, появится в .NET Standard 2.1:https://docs.microsoft.com/en-us/dotnet/api/system.timespan.op_multiply?view=netstandard-2.1
var result = 3.0 * TimeSpan.FromSeconds(3);
источник
Вы можете использовать внутренние данные TimeSpan, а именно тики.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
источник
Используйте галочки:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
источник
Умножение теперь доступно для TimeSpan !!!
Но только для .NET Core и .NET Standard .
Начиная с .NET Core 2.0 (или .NET Standard 2.1 ) вы можете успешно запустить следующий код:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Ограничения
Тем не менее, важно отметить ( как описано в документе ), что это применимо только для .NET Core 2.0 + и .NET Standard 2.1 +.
На сегодняшний день (26 ноября 2019 г.) приведенный выше код не работает даже в последней версии .NET Framework : 4.8 .
Если вы попробуете приведенный выше код в консольном приложении, например, с .NET Core 1.1 или более ранней версии или .NET Framework 4.8 или более ранней версии, вы получите следующее исключение:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
Почему не в .NET Framework?
Чтобы понять, почему мы не можем использовать приведенный выше код в .NET Framework, полезно узнать, что говорит Immo :
источник
Вам необходимо указать, какой член вы хотите умножить на 5 ->
TimeSpan.TotalMinutes * 5
источник
T * 5
также следует умножить часы и секунды.TotalMinutes
- это общая продолжительность промежутка времени, выраженная в минутах, поэтому, если промежуток времени представляет час 10 минут и 30 секунд, TotalMinutes вернет 70,5.TotalMinutes
свойство - это Double, дающее общее количество минут всего TimeSpan с учетом всех остальных полей. Это решение работает так же, хотяTicks
кажется более приятным. Но учтите, что тики позже нужно будет преобразовать в минуты, если вы хотите показать пользователю некоторую информацию, которая имеет смысл.Проблема в том, что вы хотите умножить временной интервал. Самый простой обходной путь - использовать галочки. например.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
источник