.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))
대령 패닉

2
차라리 확장 방법을 사용하고 싶습니다. 이 질문에 대한 답변에서 Stephen Hewlett이 제안한 것과 같습니다.
Mike de Klerk 2013

11
@MikedeKlerk 동의했지만 더 구문 론적 설탕입니다. 영업 이익은 여전히 어떤 방법, 확장 내부에 적용 여부를 할 수 있도록 해답의 루트를 알 필요가있다
저스틴 Pihony을

2
칭찬을 해주셔서 감사합니다.하지만 @JustinPihony가 거의 2 년 전에 답변했다는 점을 지적 할 의무가 있다고 생각합니다. 그의 답변에 내 글을 쓸 수 있었던 것은 그의 답변이었습니다.
Stephen Hewlett

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

multiplier 매개 변수는 추가 비용없이 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

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에 동일한 변경 사항을 적용하면 기존 응용 프로그램이 손상 될 수 있으며 그렇게하고 싶지 않습니다.


2

5를 곱하려는 멤버를 지정해야합니다.-> TimeSpan.TotalMinutes * 5


1
이것은 작동하지만 더 좋은 일반적인 해결책은 진드기 IMHO를 곱하는 것입니다.
Rob Levine

1
아니요, TimeSpan은 스칼라입니다. T * 5시간과 초도 곱해야합니다.
Henk Holterman 2012 년

1
@HenkHolterman이지만 TotalMinutes분 단위로 표시된 시간 범위의 총 지속 시간이므로 시간 범위가 1 시간 10 분 30 초를 나타내는 경우 TotalMinutes는 70.5를 반환합니다.
phoog

1
@HenkHolterman phoog가 지적했듯이 TotalMinutesProperty는 다른 모든 필드를 고려하여 전체 TimeSpan의 총 시간 (분)을 제공하는 Double입니다. 이 솔루션은 Ticks더 좋은 접근 방식처럼 보이지만 동일하게 작동합니다 . 그러나 사용자에게 의미있는 정보를 보여주고 싶다면 나중에 Ticks를 몇 분으로 변환해야한다는 점을 고려하십시오.
PedroC88 2012 년

동의합니다. 문장의 첫 부분에 반응했습니다. TotalMinutes는 실제로 합성 멤버가 아닙니다.
Henk Holterman 2012 년

2

여기서 문제는 시간 범위를 곱하려는 것입니다. 가장 간단한 해결 방법은 눈금을 사용하는 것입니다. 예.

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.