Como faço para multiplicar um objeto TimeSpan em C #? Supondo que a variável duration
seja um TimeSpan , gostaria, por exemplo
duration*5
Mas isso me dá um erro "operador * não pode ser aplicado aos tipos TimeSpan e int". Aqui está minha solução alternativa atual
duration+duration+duration+duration+duration
Mas isso não se estende a múltiplos não inteiros, por exemplo. duration * 3.5
Respostas:
Deste artigo
TimeSpan duration = TimeSpan.FromMinutes(1); duration = TimeSpan.FromTicks(duration.Ticks * 12); Console.WriteLine(duration);
fonte
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Para quem deseja copiar e colar:
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)); } } }
Exemplo de uso:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
terminará em 150 segundos.fonte
A
TimeSpan
estrutura não sobrecarrega o*
operador, portanto, você mesmo deve fazer isso:var result = TimeSpan.FromTicks(duration.Ticks * 5);
fonte
TimeSpan.Multiply
chegou ao .NET Core e parece que chegará ao .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);
fonte
Você pode usar os dados internos do TimeSpan, ou seja, ticks.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
fonte
Use carrapatos:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
fonte
Multiply agora está disponível para TimeSpan !!!
Mas apenas para .NET Core e .NET Standard .
Desde o .NET Core 2.0 (ou .NET Standard 2.1 ), você pode executar com êxito o seguinte código:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Limitações
No entanto, é importante observar ( conforme descrito no documento ) que isso se aplica apenas a .NET Core 2.0 + e .NET Standard 2.1 +.
A partir de hoje (26 de novembro de 2019), o código acima irá falhar mesmo na versão mais recente do .NET Framework : 4.8 .
Se você tentar o código acima em um aplicativo de console , por exemplo, executando o .NET Core 1.1 ou inferior, ou .NET Framework 4.8 ou inferior, você verá a seguinte exceção:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
Por que não no .NET Framework?
Para entender por que diabos não podemos usar o código acima no .NET Framework, é esclarecedor ver o que Immo diz :
fonte
Você precisa especificar qual membro deseja multiplicar por 5 ->
TimeSpan.TotalMinutes * 5
fonte
T * 5
deve multiplicar as horas e os segundos também.TotalMinutes
é a duração total do intervalo de tempo expresso em minutos, então se o intervalo de tempo representar uma hora e 10 minutos e 30 segundos, TotalMinutes retornaria 70,5.TotalMinutes
propriedade é um Double dando a quantidade total de minutos de todo o TimeSpan, levando todos os outros campos em consideração. Esta solução funciona da mesma forma, emboraTicks
pareça uma abordagem mais agradável. Mas leve em consideração que os Ticks posteriormente precisarão ser transformados em minutos se você quiser mostrar ao usuário alguma informação que faça sentido.O problema aqui é que você deseja multiplicar o intervalo de tempo. A solução mais simples é usar ticks. por exemplo.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
fonte