.NETでTimeSpanを乗算する


86

C#でTimeSpanオブジェクトを乗算するにはどうすればよいですか?変数durationTimeSpanであると仮定すると、たとえば、

duration*5

しかし、「演算子*はTimeSpan型とint型には適用できません」というエラーが表示されます。これが私の現在の回避策です

duration+duration+duration+duration+duration

しかし、これは非整数倍数には拡張されません。 duration * 3.5


5
これは本当に明白な要件であり、実装は簡単です。MSが標準演算子として乗算と除算を含めることを考えなかったのはなぜですか?
アンディ

回答:


103

この記事から

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

4
使用してくれてありがとうTimeSpan.FromTicks((long)(duration.Ticks*multiplier))
パニック大佐2012年

2
私はむしろ拡張メソッドを使用したいと思います。スティーブン・ヒューレットがこの質問への回答で提案したように。
Mike de Klerk 2013

11
@MikedeKlerk同意しましたが、それはより構文的な糖衣です。OPは、拡張機能であるかどうかに関係なく、任意のメソッド内で適用できるように、回答のルートを知る必要があります
Justin Pihony 2013

2
お褒めの言葉をありがとうございますが、@ JustinPihonyが私が答える2年近く前に答えたので、私が私のことを書くことができたのは彼の答えの情報であったことを指摘しなければなりません。
スティーブンヒューレット

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年

13

TimeSpan構造は、過負荷のために用意されていません*あなたはこの自分を行う必要があるので、演算子を:

var result = TimeSpan.FromTicks(duration.Ticks * 5);


5

TimeSpanの内部データ、つまりティックを使用できます。

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


3

TimeSpanでMultiplyが利用可能になりました!!!

ただし、.NETCoreおよび.NETStandardの場合のみ。

.NET Core 2.0(または.NET Standard 2.1)以降、次のコードを正常に実行できます。

Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15

制限事項

それにもかかわらず、(注目することが重要であるドキュメンタリーに記載されているように、これは唯一のために適用されること).NETコア2.0 +、および.NET標準2.1 +。

本日(2019年11月26日)の時点で、上記のコードは最新の.NETFrameworkバージョン4.8でも失敗します

たとえば、.NET Core1.1以下または.NETFramework 4.8以下を実行しているコンソールアプリケーションで上記のコードを試してみると、次の例外がスローされます。

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''

なぜ.NETFrameworkではないのですか?

いったいなぜ.NETFrameworkで上記のコードを使用できないのかを理解するために、Immoの言うことを理解することは啓発的です。

.NET Coreは、オープンソースでクロスプラットフォームの動きの速いバージョンの.NETです。サイドバイサイドであるため、.NETFrameworkに適用するリスクを冒すことのできない変更を加えることができます。これは、.NET Coreが、.NETFrameworkでは取得できない新しいAPIと言語機能を徐々に取得することを意味します。ビルドでは、.NETCoreでファイルAPIがどのように高速になるかをデモで示しました。同じ変更を.NETFrameworkに適用すると、既存のアプリケーションが破損する可能性がありますが、それは望ましくありません。


2

5を掛けるメンバーを指定する必要があります-> TimeSpan.TotalMinutes * 5


1
これは機能しますが、より良い一般的な解決策は、ティックを乗算することです。
ロブレビン

1
いいえ、TimeSpanはスカラーです。T * 5時間と秒も掛ける必要があります。
ヘンクホルターマン2012年

1
@HenkHoltermanですがTotalMinutes、これは分で表されるタイムスパンの合計期間であるため、タイムスパンが1時間10分30秒を表す場合、TotalMinutesは70.5を返します。
phoog 2012年

1
@HenkHolterman phoogが指摘しているように、TotalMinutesプロパティはDoubleであり、他のすべてのフィールドを考慮に入れて、TimeSpan全体の合計分数を示します。このソリューションは同じ Ticksように機能しますが、より良いアプローチのように見えます。ただし、意味のある情報をユーザーに表示する場合は、後でティックを分に変換する必要があることを考慮してください。
PedroC88 2012年

同意しました、私は文の最初の部分に反応しました。TotalMinutesは実際には合成メンバーではありません。
ヘンクホルターマン2012年

2

ここでの問題は、タイムスパンを乗算したいということです。最も簡単な回避策は、ティックを使用することです。例えば。

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.