在.NET中乘以TimeSpan


86

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

duration*5

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

duration+duration+duration+duration+duration

但这并不扩展到非整数倍。 duration * 3.5


5
这是一个非常明显的要求,并且易于实现。我想知道为什么MS不考虑将乘法和除法包括在内作为标准运算符?
安迪

Answers:


103

从这篇文章

TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);     

4
谢谢我用过TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Panic Panic 2012年

2
我宁愿使用扩展方法。就像斯蒂芬·休利特(Stephen Hewlett)在回答这个问题时所建议的那样。
Mike de Klerk 2013年

11
@MikedeKlerk同意,但这更多是语法糖。OP仍需要知道答案的根源,以便可以将其应用于任何方法(无论是否扩展)内
贾斯汀·皮洪尼

2
谢谢您的赞美,但我有义务指出@JustinPihony在我回答之前将近两年,正是他回答中的信息使我得以撰写我的文章。
史蒂芬·休利特

45

对于那些希望复制和粘贴的人:

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秒。


扩展方法是解决此类问题的最便捷方法。
Mike de Klerk 2013年

乘数参数的类型可以为long,而无需额外费用。
tm1 2014年



5

您可以使用TimeSpan的内部数据,即刻度。

TimeSpan day = TimeSpan.FromDays(1);
TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);


3

现在,乘法可用于TimeSpan !!!

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

为了理解为什么在地球上,我们不能在.NET框架使用上面的代码,它是启发看到什么IMMO

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


2

您需要指定要乘以5的成员-> TimeSpan.TotalMinutes * 5


1
这确实可行-但更好的一般解决方案是将刻度线乘以恕我直言。
罗布·莱文

1
不,TimeSpan是标量。T * 5应该乘以小时和秒。
Henk Holterman

1
@HenkHolterman,但是TotalMinutes时间的总持续时间以分钟表示,因此,如果时间跨度表示一个小时和10分30秒,TotalMinutes将返回70.5。
phoog 2012年

1
@HenkHolterman作为phoog注意到 TotalMinutes属性是一个Double,它考虑了所有其他字段,给出了整个TimeSpan的总分钟数。尽管Ticks看起来确实是一种更好的方法,但此解决方案的工作原理相同 。但是请注意,如果您想向用户显示一些有意义的信息,那么Ticks稍后将需要转换为分钟。
PedroC88 2012年

同意,我对句子的第一部分做出了反应。TotalMinutes并不是真正的合成成员。
Henk Holterman

2

这里的问题是您想乘以时间跨度。最简单的解决方法是使用刻度。例如。

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.