如何在C#中乘以TimeSpan对象?假设变量duration
是TimeSpan,我想,例如
duration*5
但是这给了我一个错误“operator *不能应用于TimeSpan和int类型”。这是我目前的解决方法
duration+duration+duration+duration+duration
但这并没有扩展到非整数倍数,例如。 duration * 3.5
答案 0 :(得分:92)
TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);
答案 1 :(得分:42)
对于那些希望复制和粘贴的人:
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秒。
答案 2 :(得分:12)
TimeSpan
结构不会为*
运算符提供重载,因此您必须自己执行此操作:
var result = TimeSpan.FromTicks(duration.Ticks * 5);
答案 3 :(得分:4)
您可以使用TimeSpan的内部数据,即刻度。
TimeSpan day = TimeSpan.FromDays(1);
TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
答案 4 :(得分:2)
答案 5 :(得分:1)
您需要指定要与哪个成员相乘5 - >; TimeSpan.TotalMinutes * 5
答案 6 :(得分:1)
这里的问题是你想要乘以时间跨度。最简单的解决方法是使用刻度线。例如
var ticks = TimeSpan.FromMinutes(1).Ticks;
var newTimeSpan = TimeSpan.FromTicks(ticks*5);
答案 7 :(得分:1)
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);
答案 8 :(得分:0)
但仅适用于 .NET Core 和 .NET Standard 。
由于 .NET Core 2.0 (或 .NET Standard 2.1 ),您可以成功运行以下代码:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15
不过,请注意(as described in the docu)仅适用于 .NET Core 2.0 +和 .NET Standard 2.1 +。< / p>
从今天(2019年11月26日)开始,即使在最新的 .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中使用上面的代码,看到what Immo says很有启发性:
.NET Core 是.NET的开源,跨平台且快速移动的版本。由于其并行性质,它可以进行一些更改,因此我们可以冒险将其应用于.NET Framework。这意味着.NET Core将随着时间的推移获得.NET Framework无法提供的新API和语言功能。在Build上,我们演示了如何在.NET Core上加快文件API的演示。如果我们对.NET Framework进行相同的更改,则可能会破坏现有的应用程序,而我们不想这样做。