在.NET中乘以TimeSpan

Col*_*nic 84 .net c# time timespan date

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

duration*5
Run Code Online (Sandbox Code Playgroud)

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

duration+duration+duration+duration+duration
Run Code Online (Sandbox Code Playgroud)

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

Jus*_*ony 101

从这篇文章

TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);     
Run Code Online (Sandbox Code Playgroud)

  • @MikedeKlerk同意,但那是更多的语法糖.OP仍然需要知道答案的根,以便它可以在任何方法,扩展或非扩展中应用 (10认同)
  • 谢谢我使用了'TimeSpan.FromTicks((long)(duration.Ticks*multiplier))` (4认同)
  • 谢谢你的赞美,但我觉得有必要指出@JustinPihony 比我早两年回答了,正是他的回答中的信息让我能够写下我的。 (3认同)
  • 我宁愿使用扩展方法.就像Stephen Hewlett在回答这个问题时提出的那样. (2认同)

Ste*_*ett 43

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

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));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

using Utility;

private static void Example()
{
    TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5);
}
Run Code Online (Sandbox Code Playgroud)

t 结束时间为150秒.


Ken*_*art 12

TimeSpan结构不会给*操作员带来过载,因此您必须自己完成:

var result = TimeSpan.FromTicks(duration.Ticks * 5);
Run Code Online (Sandbox Code Playgroud)


ant*_*han 9

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);
Run Code Online (Sandbox Code Playgroud)


Dec*_*oth 7

乘法现在可用于 TimeSpan !!!

但仅适用于.NET Core.NET Standard

.NET Core 2.0(或.NET Standard 2.1)开始,您可以成功运行以下代码:

Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15
Run Code Online (Sandbox Code Playgroud)

限制

然而,重要的是要注意(如文档中所述)这仅适用于.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 '*' 不能应用于类型为 'System.TimeSpan' 和 'int'' 的操作数


为什么不在 .NET Framework 中?

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

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


Ken*_*rey 5

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

TimeSpan day = TimeSpan.FromDays(1);
TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);
Run Code Online (Sandbox Code Playgroud)