¿Cómo multiplico un objeto TimeSpan en C #? Suponiendo que la variable duration
es un TimeSpan , me gustaría, por ejemplo
duration*5
Pero eso me da un error "el operador * no se puede aplicar a los tipos TimeSpan e int". Aquí está mi solución actual
duration+duration+duration+duration+duration
Pero esto no se extiende a múltiplos no enteros, por ejemplo. duration * 3.5
Respuestas:
De este articulo
TimeSpan duration = TimeSpan.FromMinutes(1); duration = TimeSpan.FromTicks(duration.Ticks * 12); Console.WriteLine(duration);
fuente
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Para aquellos que deseen copiar y pegar:
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)); } } }
Ejemplo de uso:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
terminará en 150 segundos.fuente
La
TimeSpan
estructura no proporciona una sobrecarga para el*
operador, por lo que debe hacerlo usted mismo:var result = TimeSpan.FromTicks(duration.Ticks * 5);
fuente
TimeSpan.Multiply
ha llegado a .NET Core y parece que llegará a .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);
fuente
Puede utilizar los datos internos de TimeSpan, a saber, ticks.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
fuente
Utilice garrapatas:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
fuente
Multiplicar ahora está disponible para TimeSpan !!!
Pero solo para .NET Core y .NET Standard .
Desde .NET Core 2.0 (o .NET Standard 2.1 ) puede ejecutar correctamente el siguiente código:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Limitaciones
Sin embargo, es importante tener en cuenta ( como se describe en el documento ) que esto solo se aplica a .NET Core 2.0 + y .NET Standard 2.1 +.
A partir de hoy (26 de noviembre de 2019), el código anterior fallará incluso en la última versión de .NET Framework : 4.8 .
Si prueba el código anterior en una aplicación de consola , por ejemplo, ejecutando .NET Core 1.1 o inferior, o .NET Framework 4.8 o inferior, se le lanzará la siguiente excepción:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
¿Por qué no en .NET Framework?
Para entender por qué diablos no podemos usar el código anterior en .NET Framework, es esclarecedor ver lo que dice Immo :
fuente
Debe especificar qué miembro desea multiplicar por 5 ->
TimeSpan.TotalMinutes * 5
fuente
T * 5
también debe multiplicar las horas y los segundos.TotalMinutes
es la duración total del intervalo de tiempo expresada en minutos, por lo que si el intervalo de tiempo representa una hora y 10 minutos y 30 segundos, TotalMinutes devolvería 70.5.TotalMinutes
propiedad es un doble, lo que da la cantidad total de minutos de todo el intervalo de tiempo, teniendo en cuenta todos los demás campos. Esta solución funciona de la misma manera, aunqueTicks
parece un enfoque más agradable. Pero tenga en cuenta que los Ticks luego deberán transformarse en minutos si desea mostrarle al usuario alguna información que tenga sentido.El problema aquí es que desea multiplicar el intervalo de tiempo. La solución alternativa más sencilla es utilizar ticks. p.ej.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
fuente