Bagaimana cara mengalikan objek TimeSpan di C #? Dengan asumsi variabelnya duration
adalah TimeSpan , saya ingin, misalnya
duration*5
Tapi itu memberi saya kesalahan "operator * tidak dapat diterapkan ke tipe TimeSpan dan int". Inilah solusi saya saat ini
duration+duration+duration+duration+duration
Tapi ini tidak mencakup kelipatan non-integer, misalnya. duration * 3.5
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Bagi mereka yang ingin menyalin dan menempel:
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)); } } }
Contoh Penggunaan:
using Utility; private static void Example() { TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5); }
t
akan berakhir sebagai 150 detik.sumber
The
TimeSpan
Struktur tidak memberikan kelebihan untuk*
operator, sehingga Anda harus melakukan ini sendiri:var result = TimeSpan.FromTicks(duration.Ticks * 5);
sumber
TimeSpan.Multiply
telah tiba di .NET Core, dan sepertinya itu akan tiba di .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);
sumber
Anda dapat menggunakan data internal TimeSpan, yaitu ticks.
TimeSpan day = TimeSpan.FromDays(1); TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
sumber
Multiply sekarang tersedia untuk TimeSpan !!!
Tetapi hanya untuk .NET Core dan .NET Standard .
Sejak .NET Core 2.0 (atau .NET Standard 2.1 ) Anda berhasil dapat menjalankan kode berikut:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3); // Prints: // 00:02:15
Batasan
Namun demikian, penting untuk dicatat ( seperti yang dijelaskan dalam dokumen ) bahwa ini hanya berlaku untuk .NET Core 2.0 +, dan .NET Standard 2.1 +.
Mulai hari ini (26 November 2019) kode di atas akan gagal bahkan dalam versi .NET Framework terbaru: 4.8 .
Jika Anda mencoba kode di atas dalam aplikasi Konsol , misalnya, menjalankan .NET Core 1.1 atau yang lebih rendah, atau .NET Framework 4.8 atau lebih rendah, Anda akan melihat pengecualian berikut:
Mengapa tidak di .NET Framework?
Untuk memahami mengapa kita tidak dapat menggunakan kode di atas dalam .NET Framework, sangat mencerahkan untuk melihat apa yang dikatakan Immo :
sumber
Gunakan kutu:
http://www.personal.psu.edu/wbk2/blogs/personal_blog/dotnet-stuff-timespan-multiplication-and-division.html
sumber
Anda perlu menentukan anggota mana yang ingin Anda kalikan dengan 5 ->
TimeSpan.TotalMinutes * 5
sumber
T * 5
harus mengalikan jam dan detik juga.TotalMinutes
merupakan total durasi rentang waktu yang dinyatakan dalam menit, jadi jika rentang waktu mewakili satu jam dan 10 menit dan 30 detik, TotalMinutes akan mengembalikan 70,5.TotalMinutes
Properti adalah Double yang memberikan jumlah total menit dari seluruh TimeSpan, dengan mempertimbangkan semua bidang lainnya. Solusi ini bekerja dengan cara yang sama meskipunTicks
tampaknya pendekatan yang lebih baik. Tetapi pertimbangkan bahwa Kutu nantinya perlu diubah menjadi menit jika Anda ingin menunjukkan kepada pengguna beberapa informasi yang masuk akal.Masalahnya di sini adalah Anda ingin melipatgandakan rentang waktu. Solusi paling sederhana adalah menggunakan kutu. misalnya.
var ticks = TimeSpan.FromMinutes(1).Ticks; var newTimeSpan = TimeSpan.FromTicks(ticks*5);
sumber