Jak pomnożyć obiekt TimeSpan w C #? Zakładając, że zmienna duration
jest TimeSpan , chciałbym na przykład
duration*5
Ale to daje mi błąd „operator * nie może być zastosowany do typów TimeSpan i int”. Oto moje obecne obejście
duration+duration+duration+duration+duration
Ale to nie dotyczy wielokrotności niecałkowitych, np. duration * 3.5
Odpowiedzi:
Z tego artykułu
TimeSpan duration = TimeSpan.FromMinutes(1); duration = TimeSpan.FromTicks(duration.Ticks * 12); Console.WriteLine(duration);
źródło
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Dla tych, którzy chcą kopiować i wklejać:
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)); } } }
Przykładowe zastosowanie:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
zakończy się jako 150 sekund.źródło
TimeSpan
Struktura nie zapewnia przeciążenie dla*
operatora, więc trzeba to zrobić samemu:var result = TimeSpan.FromTicks(duration.Ticks * 5);
źródło
TimeSpan.Multiply
pojawił się w .NET Core i wygląda na to, że pojawi się w .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);
źródło
Możesz użyć wewnętrznych danych TimeSpan, a mianowicie tików.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
źródło
Użyj kleszczy:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
źródło
Funkcja Multiply jest teraz dostępna dla TimeSpan !!!
Ale tylko dla .NET Core i .NET Standard .
Od .NET Core 2.0 (lub .NET Standard 2.1 ) można pomyślnie uruchomić następujący kod:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Ograniczenia
Niemniej jednak należy zauważyć ( zgodnie z opisem w dokumentacji ), że dotyczy to tylko .NET Core 2.0 + i .NET Standard 2.1 +.
Na dzień dzisiejszy (26 listopada 2019) powyższy kod zawiedzie nawet w najnowszej wersji .NET Framework : 4.8 .
Jeśli wypróbujesz powyższy kod w aplikacji konsoli , na przykład z systemem .NET Core 1.1 lub starszym albo .NET Framework 4.8 lub niższym, zostanie zgłoszony następujący wyjątek:
Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''
Dlaczego nie w .NET Framework?
Aby zrozumieć, dlaczego nie możemy użyć powyższego kodu w .NET Framework, pouczające jest to, co mówi Immo :
źródło
Musisz określić, który członek ma zostać pomnożony przez 5 ->
TimeSpan.TotalMinutes * 5
źródło
T * 5
powinien również pomnożyć godziny i sekundy.TotalMinutes
jest to całkowity czas trwania przedziału czasu wyrażony w minutach, więc jeśli przedział czasu reprezentuje godzinę oraz 10 minut i 30 sekund, TotalMinutes zwróci wartość 70,5.TotalMinutes
właściwość jest Double, podając całkowitą liczbę minut z całego TimeSpan, biorąc pod uwagę wszystkie inne pola. To rozwiązanie działa tak samo, chociażTicks
wydaje się być przyjemniejszym podejściem. Ale weź pod uwagę, że Kleszcze będą później musiały zostać przekształcone w minuty, jeśli chcesz pokazać użytkownikowi jakieś sensowne informacje.Problem polega na tym, że chcesz pomnożyć przedział czasu. Najprostszym obejściem jest użycie znaczników. na przykład.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
źródło