在.NET中乘以TimeSpan

时间:2012-03-28 13:59:54

标签: c# .net date time timespan

如何在C#中乘以TimeSpan对象?假设变量durationTimeSpan,我想,例如

duration*5

但是这给了我一个错误“operator *不能应用于TimeSpan和int类型”。这是我目前的解决方法

duration+duration+duration+duration+duration

但这并没有扩展到非整数倍数,例如。 duration * 3.5

9 个答案:

答案 0 :(得分:92)

From this article

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)

TimeSpan现在可以使用乘法!

但仅适用于 .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中?

为了理解为什么我们不能在.NET Framework中使用上面的代码,看到what Immo says很有启发性:

  

.NET Core 是.NET的开源,跨平台且快速移动的版本。由于其并行性质,它可以进行一些更改,因此我们可以冒险将其应用于.NET Framework。这意味着.NET Core将随着时间的推移获得.NET Framework无法提供的新API和语言功能。在Build上,我们演示了如何在.NET Core上加快文件API的演示。如果我们对.NET Framework进行相同的更改,则可能会破坏现有的应用程序,而我们不想这样做。