如何在C#中乘以TimeSpan对象?假设变量duration
是TimeSpan,例如
duration*5
但这给了我一个错误“运算符*不能应用于TimeSpan和int类型”。这是我目前的解决方法
duration+duration+duration+duration+duration
但这并不扩展到非整数倍。 duration * 3.5
Answers:
TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);
TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
对于那些希望复制和粘贴的人:
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秒。
该TimeSpan
结构不会为*
操作员提供重载,因此您必须自己执行此操作:
var result = TimeSpan.FromTicks(duration.Ticks * 5);
TimeSpan.Multiply
已经进入.NET Core,并且看起来将进入.NET Standard 2.1:
https://docs.microsoft.com/zh-cn/dotnet/api/system.timespan.op_multiply?view=netstandard-2.1
var result = 3.0 * TimeSpan.FromSeconds(3);
但仅适用于.NET Core和.NET Standard。
从.NET Core 2.0(或.NET Standard 2.1)开始,您可以成功运行以下代码:
Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15
但是,请务必注意(如文档中所述)这仅适用于.NET Core 2.0 +和.NET Standard 2.1。 +。
从今天(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框架使用上面的代码,它是启发看到什么IMMO说:
.NET Core是.NET的开源,跨平台和快速移动版本。由于其并行性质,它可以进行一些更改,因此我们可以冒险将其应用于.NET Framework。这意味着随着时间的推移,.NET Core将获得.NET Framework无法提供的新API和语言功能。在Build上,我们演示了如何在.NET Core上加快文件API的演示。如果我们对.NET Framework进行相同的更改,则可能会破坏现有的应用程序,而我们不想这样做。
您需要指定要乘以5的成员-> TimeSpan.TotalMinutes * 5
T * 5
应该乘以小时和秒。
TotalMinutes
时间的总持续时间以分钟表示,因此,如果时间跨度表示一个小时和10分30秒,TotalMinutes将返回70.5。
TotalMinutes
属性是一个Double,它考虑了所有其他字段,给出了整个TimeSpan的总分钟数。尽管Ticks
看起来确实是一种更好的方法,但此解决方案的工作原理相同 。但是请注意,如果您想向用户显示一些有意义的信息,那么Ticks稍后将需要转换为分钟。