[c#] .NET에서 TimeSpan 곱하기

C #에서 TimeSpan 개체를 어떻게 곱합니까? 변수 durationTimeSpan 이라고 가정하면 예를 들면 다음과 같습니다.

duration*5

그러나 “연산자 *는 TimeSpan 및 int 유형에 적용 할 수 없습니다”라는 오류가 발생합니다. 내 현재 해결 방법은 다음과 같습니다.

duration+duration+duration+duration+duration

그러나 이것은 정수가 아닌 배수로 확장되지 않습니다. duration * 3.5



답변

이 기사에서

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


답변

복사 및 붙여 넣기를 원하는 경우 :

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/en-us/dotnet/api/system.timespan.op_multiply?view=netstandard-2.1

   var result = 3.0 * TimeSpan.FromSeconds(3);


답변

TimeSpan의 내부 데이터, 즉 틱을 사용할 수 있습니다.

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


답변


답변

Multiply는 이제 TimeSpan에서 사용할 수 있습니다!

그러나 .NET Core.NET Standard .

이후 .NET 코어 2.0 (또는 .NET 표준 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 Framework에서 위의 코드를 사용할 수없는 이유를 이해하기 위해 Immo가 말하는 것을 보는 것이 좋습니다 .

.NET Core 는 오픈 소스, 크로스 플랫폼 및 빠르게 움직이는 .NET 버전입니다. 나란히있는 특성 때문에 .NET Framework에 다시 적용 할 위험이없는 변경 사항을 적용 할 수 있습니다. 즉, .NET Core는 .NET Framework가 할 수없는 새로운 API와 언어 기능을 시간이 지남에 따라 얻게됩니다. Build에서 우리는 .NET Core에서 파일 API가 어떻게 더 빠른지 데모를 보여주었습니다. .NET Framework에 동일한 변경 사항을 적용하면 기존 응용 프로그램이 손상 될 수 있으며 그렇게하고 싶지 않습니다.