Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# TimeSpan.Subtract() 메서드 완벽 가이드

C#의 TimeSpan.Subtract() 메서드는 현재 TimeSpan 인스턴스에서 지정된 TimeSpan 값을 빼서 새로운 TimeSpan 객체를 반환합니다. 이 메서드는 시간 간격 간의 차이를 계산할 때 필수적으로 사용됩니다.

구문 (Syntax)

public TimeSpan Subtract(TimeSpan span);

매개변수

  • span: 현재 인스턴스에서 뺄 시간 간격 (TimeSpan 타입)

반환 값

현재 인스턴스에서 span을 뺀 결과로서 새로운 TimeSpan 객체를 반환합니다. 결과가 음수 시간 간격이 될 수도 있습니다.

예제 1: 기본적인 뺄셈 연산

다양한 방식으로 생성된 TimeSpan 객체들 간의 뺄셈을 보여줍니다.

using System;

public class Demo {
    public static void Main() {
        // 다양한 단위로 TimeSpan 생성
        TimeSpan span1 = TimeSpan.FromTicks(1);           // 1틱 (100나노초)
        TimeSpan span2 = new TimeSpan(1);                  // 1틱 (동일)
        TimeSpan span3 = TimeSpan.FromHours(1);            // 1시간
        TimeSpan span4 = TimeSpan.FromMilliseconds(1);     // 1밀리초
        TimeSpan span5 = TimeSpan.FromMinutes(1);          // 1분
        TimeSpan span6 = TimeSpan.FromMinutes(1);          // 1분

        // 각 TimeSpan 값 출력
        Console.WriteLine("TimeSpan1 = " + span1);
        Console.WriteLine("TimeSpan2 = " + span2);
        Console.WriteLine("TimeSpan3 = " + span3);
        Console.WriteLine("TimeSpan4 = " + span4);
        Console.WriteLine("TimeSpan5 = " + span5);

        // 비교 연산 (참고용)
        Console.WriteLine("비교 (span1 vs span2) = " + TimeSpan.Compare(span1, span2));
        Console.WriteLine("비교 (span2 vs span3) = " + TimeSpan.Compare(span2, span3));
        Console.WriteLine("비교 (span1 vs span3) = " + TimeSpan.Compare(span1, span3));
        Console.WriteLine("비교 (span3 vs span4) = " + TimeSpan.Compare(span3, span4));
        Console.WriteLine("비교 (span4 vs span5) = " + TimeSpan.Compare(span4, span5));

        // Subtract 메서드 사용
        TimeSpan res1 = span1.Subtract(span2);  // 동일 값끼리 뺄셈
        TimeSpan res2 = span2.Subtract(span2);  // 자기 자신 뺄셈
        
        Console.WriteLine("결과 (span1 - span2) = " + res1);
        Console.WriteLine("결과 (span2 - span2) = " + res2);
    }
}

실행 결과

TimeSpan1 = 00:00:00.0000001
TimeSpan2 = 00:00:00.0000001
TimeSpan3 = 01:00:00
TimeSpan4 = 00:00:00.0010000
TimeSpan5 = 00:01:00
비교 (span1 vs span2) = 0
비교 (span2 vs span3) = -1
비교 (span1 vs span3) = -1
비교 (span3 vs span4) = 1
비교 (span4 vs span5) = -1
결과 (span1 - span2) = 00:00:00
결과 (span2 - span2) = 00:00:00

예제 2: 실제 시나리오에서의 시간 차이 계산

더 현실적인 시간 간격들 간의 뺄셈을 보여줍니다.

using System;

public class Demo {
    public static void Main() {
        TimeSpan span1 = TimeSpan.FromTicks(1500);           // 0.00015초
        TimeSpan span2 = new TimeSpan(2, 40, 55);            // 2시간 40분 55초
        TimeSpan span3 = TimeSpan.FromHours(5);              // 5시간
        TimeSpan span4 = TimeSpan.FromMilliseconds(1000);    // 1초
        TimeSpan span5 = TimeSpan.FromMinutes(50);           // 50분
        TimeSpan span6 = TimeSpan.FromMinutes(50);           // 50분

        Console.WriteLine("TimeSpan1 = " + span1);
        Console.WriteLine("TimeSpan2 = " + span2);
        Console.WriteLine("TimeSpan3 = " + span3);
        Console.WriteLine("TimeSpan4 = " + span4);
        Console.WriteLine("TimeSpan5 = " + span5);

        Console.WriteLine("비교 (span1 vs span2) = " + TimeSpan.Compare(span1, span2));
        Console.WriteLine("비교 (span2 vs span3) = " + TimeSpan.Compare(span2, span3));
        Console.WriteLine("비교 (span1 vs span3) = " + TimeSpan.Compare(span1, span3));
        Console.WriteLine("비교 (span3 vs span4) = " + TimeSpan.Compare(span3, span4));
        Console.WriteLine("비교 (span4 vs span5) = " + TimeSpan.Compare(span4, span5));

        // 큰 값에서 작은 값 빼기 (음수 결과 발생)
        TimeSpan res1 = span1.Subtract(span2);
        // 같은 값끼리 빼기
        TimeSpan res2 = span2.Subtract(span2);
        
        Console.WriteLine("결과 (span1 - span2) = " + res1);
        Console.WriteLine("결과 (span2 - span2) = " + res2);
    }
}

실행 결과

TimeSpan1 = 00:00:00.0001500
TimeSpan2 = 02:40:55
TimeSpan3 = 05:00:00
TimeSpan4 = 00:00:01
TimeSpan5 = 00:50:00
비교 (span1 vs span2) = -1
비교 (span2 vs span3) = -1
비교 (span1 vs span3) = -1
비교 (span3 vs span4) = 1
비교 (span4 vs span5) = -1
결과 (span1 - span2) = -02:40:54.9998500
결과 (span2 - span2) = 00:00:00

핵심 포인트 및 주의사항

  • 불변성: TimeSpan은 불변(immutable) 타입이므로, Subtract()는 기존 인스턴스를 변경하지 않고 새로운 인스턴스를 반환합니다.
  • 음수 결과 허용: 뺄셈 결과가 음수 시간 간격이 될 수 있습니다 (예제 2의 res1 참고).
  • 연산자 오버로딩: span1 - span2 형태의 빼기 연산자(-)도 동일하게 작동하며, 내부적으로 Subtract()를 호출합니다.
  • 예외 처리: 이 메서드는 예외를 던지지 않으며, 오버플로우 시 TimeSpan.MinValue 또는 TimeSpan.MaxValue를 반환합니다.

관련 메서드

  • TimeSpan.Add() / + 연산자: 시간 간격 더하기
  • TimeSpan.Compare(): 두 TimeSpan 비교 (-1, 0, 1 반환)
  • TimeSpan.Duration(): 절대값(양수) 시간 간격 반환
  • TimeSpan.Negate(): 부호 반전

요약

TimeSpan.Subtract() 메서드는 두 시간 간격의 차이를 구할 때 사용하는 핵심 메서드입니다. 반환값이 새로운 TimeSpan 객체이므로 체이닝이 가능하며, 음수 결과도 정상적으로 처리됩니다. 실제로는 빼기 연산자(-)를 더 자주 사용하지만, 메서드 형태가 필요한 경우(예: LINQ, 리플렉션 등)에 유용합니다.